瀏覽代碼

广告账户定制化

zq940222 5 月之前
父節點
當前提交
50bb6bcfd6

+ 64 - 0
src/views/demo/adsaccount/AdsAccount.api.ts

@@ -0,0 +1,64 @@
+import {defHttp} from '/src/utils/http/axios';
+import { useMessage } from "/src/hooks/web/useMessage";
+
+const { createConfirm } = useMessage();
+
+enum Api {
+  list = '/adsaccount/adsAccount/list',
+  save='/adsaccount/adsAccount/add',
+  edit='/adsaccount/adsAccount/edit',
+  deleteOne = '/adsaccount/adsAccount/delete',
+  deleteBatch = '/adsaccount/adsAccount/deleteBatch',
+  importExcel = '/adsaccount/adsAccount/importExcel',
+  exportXls = '/adsaccount/adsAccount/exportXls',
+}
+/**
+ * 导出api
+ * @param params
+ */
+export const getExportUrl = Api.exportXls;
+/**
+ * 导入api
+ */
+export const getImportUrl = Api.importExcel;
+/**
+ * 列表接口
+ * @param params
+ */
+export const list = (params) =>
+  defHttp.get({url: Api.list, params});
+
+/**
+ * 删除单个
+ */
+export const deleteOne = (params,handleSuccess) => {
+  return defHttp.delete({url: Api.deleteOne, params}, {joinParamsToUrl: true}).then(() => {
+    handleSuccess();
+  });
+}
+/**
+ * 批量删除
+ * @param params
+ */
+export const batchDelete = (params, handleSuccess) => {
+  createConfirm({
+    iconType: 'warning',
+    title: '确认删除',
+    content: '是否删除选中数据',
+    okText: '确认',
+    cancelText: '取消',
+    onOk: () => {
+      return defHttp.delete({url: Api.deleteBatch, data: params}, {joinParamsToUrl: true}).then(() => {
+        handleSuccess();
+      });
+    }
+  });
+}
+/**
+ * 保存或者更新
+ * @param params
+ */
+export const saveOrUpdate = (params, isUpdate) => {
+  let url = isUpdate ? Api.edit : Api.save;
+  return defHttp.post({url: url, params});
+}

+ 264 - 0
src/views/demo/adsaccount/AdsAccount.data.ts

@@ -0,0 +1,264 @@
+import {BasicColumn} from '/src/components/Table';
+import {FormSchema} from '/src/components/Table';
+import { rules} from '/src/utils/helper/validator';
+import { render } from '/src/utils/common/renderUtils';
+import { getWeekMonthQuarterYear } from '/src/utils';
+//列表数据
+export const columns: BasicColumn[] = [
+   {
+    title: '关联用户ID',
+    align:"center",
+    dataIndex: 'userId_dictText'
+   },
+   {
+    title: '账号',
+    align:"center",
+    dataIndex: 'accountId'
+   },
+   {
+    title: '账号名',
+    align:"center",
+    dataIndex: 'accountName'
+   },
+   {
+    title: '账号渠道',
+    align:"center",
+    dataIndex: 'accountChannel_dictText'
+   },
+   {
+    title: '账号分类',
+    align:"center",
+    dataIndex: 'accountCategory_dictText'
+   },
+   {
+    title: '账号状态',
+    align:"center",
+    dataIndex: 'accountStatus_dictText'
+   },
+   {
+    title: '检查状态',
+    align:"center",
+    dataIndex: 'reviewStatus_dictText'
+   },
+   {
+    title: '币种',
+    align:"center",
+    dataIndex: 'currencyCode_dictText'
+   },
+   {
+    title: '公司',
+    align:"center",
+    dataIndex: 'company'
+   },
+   {
+    title: '网址',
+    align:"center",
+    dataIndex: 'website'
+   },
+   {
+    title: '领域',
+    align:"center",
+    dataIndex: 'industry'
+   },
+   {
+    title: '邮箱',
+    align:"center",
+    dataIndex: 'email'
+   },
+   {
+    title: '创建时间',
+    align:"center",
+    dataIndex: 'createdAt',
+    customRender:({text}) =>{
+      text = !text ? "" : (text.length > 10 ? text.substr(0,10) : text);
+      return text;
+    },
+   },
+   {
+    title: '更新时间',
+    align:"center",
+    dataIndex: 'updatedAt',
+    customRender:({text}) =>{
+      text = !text ? "" : (text.length > 10 ? text.substr(0,10) : text);
+      return text;
+    },
+   },
+];
+//查询数据
+export const searchFormSchema: FormSchema[] = [
+];
+//表单数据
+export const formSchema: FormSchema[] = [
+  {
+    label: '关联用户ID',
+    field: 'userId',
+    component: 'JSearchSelect',
+    componentProps:{
+       dict:"user_login,username,id"
+    },
+    dynamicRules: ({model,schema}) => {
+          return [
+                 { required: true, message: '请输入关联用户ID!'},
+          ];
+     },
+  },
+  {
+    label: '账号',
+    field: 'accountId',
+    component: 'Input',
+    dynamicRules: ({model,schema}) => {
+          return [
+                 { required: true, message: '请输入账号!'},
+          ];
+     },
+  },
+  {
+    label: '账号名',
+    field: 'accountName',
+    component: 'Input',
+    dynamicRules: ({model,schema}) => {
+          return [
+                 { required: true, message: '请输入账号名!'},
+          ];
+     },
+  },
+  {
+    label: '账号渠道',
+    field: 'accountChannel',
+    component: 'JDictSelectTag',
+    componentProps:{
+        dictCode:"account_channel"
+     },
+    dynamicRules: ({model,schema}) => {
+          return [
+                 { required: true, message: '请输入账号渠道!'},
+          ];
+     },
+  },
+  {
+    label: '账号分类',
+    field: 'accountCategory',
+    component: 'JDictSelectTag',
+    componentProps:{
+        dictCode:"account_category"
+     },
+    dynamicRules: ({model,schema}) => {
+          return [
+                 { required: true, message: '请输入账号分类!'},
+          ];
+     },
+  },
+  {
+    label: '账号状态',
+    field: 'accountStatus',
+    component: 'JDictSelectTag',
+    componentProps:{
+        dictCode:"account_status"
+     },
+    dynamicRules: ({model,schema}) => {
+          return [
+                 { required: true, message: '请输入账号状态!'},
+          ];
+     },
+  },
+  {
+    label: '检查状态',
+    field: 'reviewStatus',
+    component: 'JDictSelectTag',
+    componentProps:{
+        dictCode:"review_status"
+     },
+    dynamicRules: ({model,schema}) => {
+          return [
+                 { required: true, message: '请输入检查状态!'},
+          ];
+     },
+  },
+  {
+    label: '币种',
+    field: 'currencyCode',
+    component: 'JDictSelectTag',
+    componentProps:{
+        dictCode:"currency_code"
+     },
+    dynamicRules: ({model,schema}) => {
+          return [
+                 { required: true, message: '请输入币种!'},
+          ];
+     },
+  },
+  {
+    label: '公司',
+    field: 'company',
+    component: 'Input',
+    dynamicRules: ({model,schema}) => {
+          return [
+                 { required: true, message: '请输入公司!'},
+          ];
+     },
+  },
+  {
+    label: '网址',
+    field: 'website',
+    component: 'Input',
+    dynamicRules: ({model,schema}) => {
+          return [
+                 { required: true, message: '请输入网址!'},
+          ];
+     },
+  },
+  {
+    label: '领域',
+    field: 'industry',
+    component: 'Input',
+    dynamicRules: ({model,schema}) => {
+          return [
+                 { required: true, message: '请输入领域!'},
+          ];
+     },
+  },
+  {
+    label: '邮箱',
+    field: 'email',
+    component: 'Input',
+    dynamicRules: ({model,schema}) => {
+          return [
+                 { required: true, message: '请输入邮箱!'},
+          ];
+     },
+  },
+	// TODO 主键隐藏字段,目前写死为ID
+	{
+	  label: '',
+	  field: 'id',
+	  component: 'Input',
+	  show: false
+	},
+];
+
+// 高级查询数据
+export const superQuerySchema = {
+  userId: {title: '关联用户ID',order: 0,view: 'number', type: 'number',dictTable: "user_login", dictCode: 'id', dictText: 'username',},
+  accountId: {title: '账号',order: 1,view: 'text', type: 'string',},
+  accountName: {title: '账号名',order: 2,view: 'text', type: 'string',},
+  accountChannel: {title: '账号渠道',order: 3,view: 'list', type: 'string',dictCode: 'account_channel',},
+  accountCategory: {title: '账号分类',order: 4,view: 'list', type: 'string',dictCode: 'account_category',},
+  accountStatus: {title: '账号状态',order: 5,view: 'list', type: 'string',dictCode: 'account_status',},
+  reviewStatus: {title: '检查状态',order: 6,view: 'list', type: 'string',dictCode: 'review_status',},
+  currencyCode: {title: '币种',order: 7,view: 'list', type: 'string',dictCode: 'currency_code',},
+  company: {title: '公司',order: 8,view: 'text', type: 'string',},
+  website: {title: '网址',order: 9,view: 'text', type: 'string',},
+  industry: {title: '领域',order: 10,view: 'text', type: 'string',},
+  email: {title: '邮箱',order: 11,view: 'text', type: 'string',},
+  createdAt: {title: '创建时间',order: 12,view: 'date', type: 'string',},
+  updatedAt: {title: '更新时间',order: 13,view: 'date', type: 'string',},
+};
+
+/**
+* 流程表单调用这个方法获取formSchema
+* @param param
+*/
+export function getBpmFormSchema(_formData): FormSchema[]{
+  // 默认和原始表单保持一致 如果流程中配置了权限数据,这里需要单独处理formSchema
+  return formSchema;
+}

+ 188 - 0
src/views/demo/adsaccount/AdsAccountList.vue

@@ -0,0 +1,188 @@
+<template>
+  <div>
+    <!--引用表格-->
+   <BasicTable @register="registerTable" :rowSelection="rowSelection">
+     <!--插槽:table标题-->
+      <template #tableTitle>
+          <a-button type="primary" @click="handleAdd" preIcon="ant-design:plus-outlined"> 新增</a-button>
+          <a-button  type="primary" preIcon="ant-design:export-outlined" @click="onExportXls"> 导出</a-button>
+          <j-upload-button  type="primary" preIcon="ant-design:import-outlined" @click="onImportXls">导入</j-upload-button>
+          <a-dropdown v-if="selectedRowKeys.length > 0">
+              <template #overlay>
+                <a-menu>
+                  <a-menu-item key="1" @click="batchHandleDelete">
+                    <Icon icon="ant-design:delete-outlined"></Icon>
+                    删除
+                  </a-menu-item>
+                </a-menu>
+              </template>
+              <a-button>批量操作
+                <Icon icon="mdi:chevron-down"></Icon>
+              </a-button>
+        </a-dropdown>
+        <!-- 高级查询 -->
+        <super-query :config="superQueryConfig" @search="handleSuperQuery" />
+      </template>
+       <!--操作栏-->
+      <template #action="{ record }">
+        <TableAction :actions="getTableAction(record)" :dropDownActions="getDropDownAction(record)"/>
+      </template>
+      <!--字段回显插槽-->
+      <template v-slot:bodyCell="{ column, record, index, text }">
+      </template>
+    </BasicTable>
+    <!-- 表单区域 -->
+    <AdsAccountModal @register="registerModal" @success="handleSuccess"></AdsAccountModal>
+  </div>
+</template>
+
+<script lang="ts" name="adsaccount-adsAccount" setup>
+  import {ref, reactive, computed, unref} from 'vue';
+  import {BasicTable, useTable, TableAction} from '/src/components/Table';
+  import {useModal} from '/src/components/Modal';
+  import { useListPage } from '/src/hooks/system/useListPage'
+  import AdsAccountModal from './components/AdsAccountModal.vue'
+  import {columns, searchFormSchema, superQuerySchema} from './AdsAccount.data';
+  import {list, deleteOne, batchDelete, getImportUrl,getExportUrl} from './AdsAccount.api';
+  import { downloadFile } from '/src/utils/common/renderUtils';
+  import { useUserStore } from '/src/store/modules/user';
+  const queryParam = reactive<any>({});
+  const checkedKeys = ref<Array<string | number>>([]);
+  const userStore = useUserStore();
+  //注册model
+  const [registerModal, {openModal}] = useModal();
+  //注册table数据
+  const { prefixCls,tableContext,onExportXls,onImportXls } = useListPage({
+      tableProps:{
+           title: '广告账户管理',
+           api: list,
+           columns,
+           canResize:false,
+           formConfig: {
+              //labelWidth: 120,
+              schemas: searchFormSchema,
+              autoSubmitOnEnter:true,
+              showAdvancedButton:true,
+              fieldMapToNumber: [
+              ],
+              fieldMapToTime: [
+              ],
+            },
+           actionColumn: {
+               width: 120,
+               fixed:'right'
+            },
+            beforeFetch: (params) => {
+              return Object.assign(params, queryParam);
+            },
+      },
+       exportConfig: {
+            name:"广告账户管理",
+            url: getExportUrl,
+            params: queryParam,
+          },
+          importConfig: {
+            url: getImportUrl,
+            success: handleSuccess
+          },
+  })
+
+  const [registerTable, {reload},{ rowSelection, selectedRowKeys }] = tableContext
+
+  // 高级查询配置
+  const superQueryConfig = reactive(superQuerySchema);
+
+  /**
+   * 高级查询事件
+   */
+  function handleSuperQuery(params) {
+    Object.keys(params).map((k) => {
+      queryParam[k] = params[k];
+    });
+    reload();
+  }
+   /**
+    * 新增事件
+    */
+  function handleAdd() {
+     openModal(true, {
+       isUpdate: false,
+       showFooter: true,
+     });
+  }
+   /**
+    * 编辑事件
+    */
+  function handleEdit(record: Recordable) {
+     openModal(true, {
+       record,
+       isUpdate: true,
+       showFooter: true,
+     });
+   }
+   /**
+    * 详情
+   */
+  function handleDetail(record: Recordable) {
+     openModal(true, {
+       record,
+       isUpdate: true,
+       showFooter: false,
+     });
+   }
+   /**
+    * 删除事件
+    */
+  async function handleDelete(record) {
+     await deleteOne({id: record.id}, handleSuccess);
+   }
+   /**
+    * 批量删除事件
+    */
+  async function batchHandleDelete() {
+     await batchDelete({ids: selectedRowKeys.value}, handleSuccess);
+   }
+   /**
+    * 成功回调
+    */
+  function handleSuccess() {
+      (selectedRowKeys.value = []) && reload();
+   }
+   /**
+      * 操作栏
+      */
+  function getTableAction(record){
+       return [
+         {
+           label: '编辑',
+           onClick: handleEdit.bind(null, record),
+         }
+       ]
+   }
+     /**
+        * 下拉操作栏
+        */
+  function getDropDownAction(record){
+       return [
+         {
+           label: '详情',
+           onClick: handleDetail.bind(null, record),
+         }, {
+           label: '删除',
+           popConfirm: {
+             title: '是否确认删除',
+             confirm: handleDelete.bind(null, record),
+             placement: 'topLeft',
+           }
+         }
+       ]
+   }
+
+
+</script>
+
+<style scoped>
+  :deep(.ant-picker),:deep(.ant-input-number){
+    width: 100%;
+  }
+</style>

+ 26 - 0
src/views/demo/adsaccount/V20240920_1__menu_insert_AdsAccount.sql

@@ -0,0 +1,26 @@
+-- 注意:该页面对应的前台目录为views/adsaccount文件夹下
+-- 如果你想更改到其他目录,请修改sql中component字段对应的值
+
+
+INSERT INTO sys_permission(id, parent_id, name, url, component, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_route, is_leaf, keep_alive, hidden, hide_tab, description, status, del_flag, rule_flag, create_by, create_time, update_by, update_time, internal_or_external) 
+VALUES ('202409200429550410', NULL, '广告账户管理', '/adsaccount/adsAccountList', 'adsaccount/AdsAccountList', NULL, NULL, 0, NULL, '1', 0.00, 0, NULL, 1, 0, 0, 0, 0, NULL, '1', 0, 0, 'admin', '2024-09-20 16:29:41', NULL, NULL, 0);
+
+-- 权限控制sql
+-- 新增
+INSERT INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external)
+VALUES ('202409200429560411', '202409200429550410', '添加广告账户管理', NULL, NULL, 0, NULL, NULL, 2, 'adsaccount:ads_account:add', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2024-09-20 16:29:41', NULL, NULL, 0, 0, '1', 0);
+-- 编辑
+INSERT INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external)
+VALUES ('202409200429560412', '202409200429550410', '编辑广告账户管理', NULL, NULL, 0, NULL, NULL, 2, 'adsaccount:ads_account:edit', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2024-09-20 16:29:41', NULL, NULL, 0, 0, '1', 0);
+-- 删除
+INSERT INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external)
+VALUES ('202409200429560413', '202409200429550410', '删除广告账户管理', NULL, NULL, 0, NULL, NULL, 2, 'adsaccount:ads_account:delete', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2024-09-20 16:29:41', NULL, NULL, 0, 0, '1', 0);
+-- 批量删除
+INSERT INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external)
+VALUES ('202409200429560414', '202409200429550410', '批量删除广告账户管理', NULL, NULL, 0, NULL, NULL, 2, 'adsaccount:ads_account:deleteBatch', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2024-09-20 16:29:41', NULL, NULL, 0, 0, '1', 0);
+-- 导出excel
+INSERT INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external)
+VALUES ('202409200429560415', '202409200429550410', '导出excel_广告账户管理', NULL, NULL, 0, NULL, NULL, 2, 'adsaccount:ads_account:exportXls', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2024-09-20 16:29:41', NULL, NULL, 0, 0, '1', 0);
+-- 导入excel
+INSERT INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external)
+VALUES ('202409200429560416', '202409200429550410', '导入excel_广告账户管理', NULL, NULL, 0, NULL, NULL, 2, 'adsaccount:ads_account:importExcel', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2024-09-20 16:29:41', NULL, NULL, 0, 0, '1', 0);

+ 70 - 0
src/views/demo/adsaccount/components/AdsAccountForm.vue

@@ -0,0 +1,70 @@
+<template>
+    <div style="min-height: 400px">
+        <BasicForm @register="registerForm"></BasicForm>
+        <div style="width: 100%;text-align: center" v-if="!formDisabled">
+            <a-button @click="submitForm" pre-icon="ant-design:check" type="primary">提 交</a-button>
+        </div>
+    </div>
+</template>
+
+<script lang="ts">
+    import {BasicForm, useForm} from '/src/components/Form';
+    import {computed, defineComponent} from 'vue';
+    import {defHttp} from '/src/utils/http/axios';
+    import { propTypes } from '/src/utils/propTypes';
+    import {getBpmFormSchema} from '../AdsAccount.data';
+    import {saveOrUpdate} from '../AdsAccount.api';
+    
+    export default defineComponent({
+        name: "AdsAccountForm",
+        components:{
+            BasicForm
+        },
+        props:{
+            formData: propTypes.object.def({}),
+            formBpm: propTypes.bool.def(true),
+        },
+        setup(props){
+            const [registerForm, { setFieldsValue, setProps, getFieldsValue }] = useForm({
+                labelWidth: 150,
+                schemas: getBpmFormSchema(props.formData),
+                showActionButtonGroup: false,
+                baseColProps: {span: 24}
+            });
+
+            const formDisabled = computed(()=>{
+                if(props.formData.disabled === false){
+                    return false;
+                }
+                return true;
+            });
+
+            let formData = {};
+            const queryByIdUrl = '/adsaccount/adsAccount/queryById';
+            async function initFormData(){
+                let params = {id: props.formData.dataId};
+                const data = await defHttp.get({url: queryByIdUrl, params});
+                formData = {...data}
+                //设置表单的值
+                await setFieldsValue(formData);
+                //默认是禁用
+                await setProps({disabled: formDisabled.value})
+            }
+
+            async function submitForm() {
+                let data = getFieldsValue();
+                let params = Object.assign({}, formData, data);
+                console.log('表单数据', params)
+                await saveOrUpdate(params, true)
+            }
+
+            initFormData();
+            
+            return {
+                registerForm,
+                formDisabled,
+                submitForm,
+            }
+        }
+    });
+</script>

+ 68 - 0
src/views/demo/adsaccount/components/AdsAccountModal.vue

@@ -0,0 +1,68 @@
+<template>
+  <BasicModal v-bind="$attrs" @register="registerModal" destroyOnClose :title="title" :width="800" @ok="handleSubmit">
+      <BasicForm @register="registerForm"/>
+  </BasicModal>
+</template>
+
+<script lang="ts" setup>
+    import {ref, computed, unref} from 'vue';
+    import {BasicModal, useModalInner} from '/src/components/Modal';
+    import {BasicForm, useForm} from '/src/components/Form';
+    import {formSchema} from '../AdsAccount.data';
+    import {saveOrUpdate} from '../AdsAccount.api';
+    // Emits声明
+    const emit = defineEmits(['register','success']);
+    const isUpdate = ref(true);
+    const isDetail = ref(false);
+    //表单配置
+    const [registerForm, {setProps,resetFields, setFieldsValue, validate}] = useForm({
+        //labelWidth: 150,
+        schemas: formSchema,
+        showActionButtonGroup: false,
+        baseColProps: {span: 24}
+    });
+    //表单赋值
+    const [registerModal, {setModalProps, closeModal}] = useModalInner(async (data) => {
+        //重置表单
+        await resetFields();
+        setModalProps({confirmLoading: false,showCancelBtn:!!data?.showFooter,showOkBtn:!!data?.showFooter});
+        isUpdate.value = !!data?.isUpdate;
+        isDetail.value = !!data?.showFooter;
+        if (unref(isUpdate)) {
+            //表单赋值
+            await setFieldsValue({
+                ...data.record,
+            });
+        }
+        // 隐藏底部时禁用整个表单
+       setProps({ disabled: !data?.showFooter })
+    });
+    //设置标题
+    const title = computed(() => (!unref(isUpdate) ? '新增' : !unref(isDetail) ? '详情' : '编辑'));
+    //表单提交事件
+    async function handleSubmit(v) {
+        try {
+            let values = await validate();
+            setModalProps({confirmLoading: true});
+            //提交表单
+            await saveOrUpdate(values, isUpdate.value);
+            //关闭弹窗
+            closeModal();
+            //刷新列表
+            emit('success');
+        } finally {
+            setModalProps({confirmLoading: false});
+        }
+    }
+</script>
+
+<style lang="less" scoped>
+	/** 时间和数字输入框样式 */
+  :deep(.ant-input-number) {
+    width: 100%;
+  }
+
+  :deep(.ant-calendar-picker) {
+    width: 100%;
+  }
+</style>