| @@ -57,12 +57,13 @@ class AppListApi(Resource): | |||
| ) | |||
| parser.add_argument("name", type=str, location="args", required=False) | |||
| parser.add_argument("tag_ids", type=uuid_list, location="args", required=False) | |||
| parser.add_argument("is_created_by_me", type=inputs.boolean, location="args", required=False) | |||
| args = parser.parse_args() | |||
| # get app list | |||
| app_service = AppService() | |||
| app_pagination = app_service.get_paginate_apps(current_user.current_tenant_id, args) | |||
| app_pagination = app_service.get_paginate_apps(current_user.id, current_user.current_tenant_id, args) | |||
| if not app_pagination: | |||
| return {"data": [], "total": 0, "page": 1, "limit": 20, "has_more": False} | |||
| @@ -26,9 +26,10 @@ from tasks.remove_app_and_related_data_task import remove_app_and_related_data_t | |||
| class AppService: | |||
| def get_paginate_apps(self, tenant_id: str, args: dict) -> Pagination | None: | |||
| def get_paginate_apps(self, user_id: str, tenant_id: str, args: dict) -> Pagination | None: | |||
| """ | |||
| Get app list with pagination | |||
| :param user_id: user id | |||
| :param tenant_id: tenant id | |||
| :param args: request args | |||
| :return: | |||
| @@ -44,6 +45,8 @@ class AppService: | |||
| elif args["mode"] == "channel": | |||
| filters.append(App.mode == AppMode.CHANNEL.value) | |||
| if args.get("is_created_by_me", False): | |||
| filters.append(App.created_by == user_id) | |||
| if args.get("name"): | |||
| name = args["name"][:30] | |||
| filters.append(App.name.ilike(f"%{name}%")) | |||
| @@ -25,16 +25,18 @@ import Input from '@/app/components/base/input' | |||
| import { useStore as useTagStore } from '@/app/components/base/tag-management/store' | |||
| import TagManagementModal from '@/app/components/base/tag-management' | |||
| import TagFilter from '@/app/components/base/tag-management/filter' | |||
| import CheckboxWithLabel from '@/app/components/datasets/create/website/base/checkbox-with-label' | |||
| const getKey = ( | |||
| pageIndex: number, | |||
| previousPageData: AppListResponse, | |||
| activeTab: string, | |||
| isCreatedByMe: boolean, | |||
| tags: string[], | |||
| keywords: string, | |||
| ) => { | |||
| if (!pageIndex || previousPageData.has_more) { | |||
| const params: any = { url: 'apps', params: { page: pageIndex + 1, limit: 30, name: keywords } } | |||
| const params: any = { url: 'apps', params: { page: pageIndex + 1, limit: 30, name: keywords, is_created_by_me: isCreatedByMe } } | |||
| if (activeTab !== 'all') | |||
| params.params.mode = activeTab | |||
| @@ -58,6 +60,7 @@ const Apps = () => { | |||
| defaultTab: 'all', | |||
| }) | |||
| const { query: { tagIDs = [], keywords = '' }, setQuery } = useAppsQueryState() | |||
| const [isCreatedByMe, setIsCreatedByMe] = useState(false) | |||
| const [tagFilterValue, setTagFilterValue] = useState<string[]>(tagIDs) | |||
| const [searchKeywords, setSearchKeywords] = useState(keywords) | |||
| const setKeywords = useCallback((keywords: string) => { | |||
| @@ -68,7 +71,7 @@ const Apps = () => { | |||
| }, [setQuery]) | |||
| const { data, isLoading, setSize, mutate } = useSWRInfinite( | |||
| (pageIndex: number, previousPageData: AppListResponse) => getKey(pageIndex, previousPageData, activeTab, tagIDs, searchKeywords), | |||
| (pageIndex: number, previousPageData: AppListResponse) => getKey(pageIndex, previousPageData, activeTab, isCreatedByMe, tagIDs, searchKeywords), | |||
| fetchAppList, | |||
| { revalidateFirstPage: true }, | |||
| ) | |||
| @@ -132,6 +135,12 @@ const Apps = () => { | |||
| options={options} | |||
| /> | |||
| <div className='flex items-center gap-2'> | |||
| <CheckboxWithLabel | |||
| className='mr-2' | |||
| label={t('app.showMyCreatedAppsOnly')} | |||
| isChecked={isCreatedByMe} | |||
| onChange={() => setIsCreatedByMe(!isCreatedByMe)} | |||
| /> | |||
| <TagFilter type='app' value={tagFilterValue} onChange={handleTagsChange} /> | |||
| <Input | |||
| showLeftIcon | |||
| @@ -190,6 +190,7 @@ const translation = { | |||
| byCategories: 'NACH KATEGORIEN', | |||
| searchAllTemplate: 'Alle Vorlagen durchsuchen...', | |||
| }, | |||
| showMyCreatedAppsOnly: 'Nur meine erstellten Apps anzeigen', | |||
| } | |||
| export default translation | |||
| @@ -169,6 +169,7 @@ const translation = { | |||
| removeConfirmContent: 'The current configuration is in use, removing it will turn off the Tracing feature.', | |||
| }, | |||
| }, | |||
| showMyCreatedAppsOnly: 'Created by me', | |||
| } | |||
| export default translation | |||
| @@ -183,6 +183,7 @@ const translation = { | |||
| byCategories: 'POR CATEGORÍAS', | |||
| searchAllTemplate: 'Buscar todas las plantillas...', | |||
| }, | |||
| showMyCreatedAppsOnly: 'Mostrar solo mis aplicaciones creadas', | |||
| } | |||
| export default translation | |||
| @@ -183,6 +183,7 @@ const translation = { | |||
| byCategories: 'بر اساس دسته بندی ها', | |||
| searchAllTemplate: 'همه قالب ها را جستجو کنید...', | |||
| }, | |||
| showMyCreatedAppsOnly: 'فقط برنامههای ایجاد شده توسط من را نشان بده', | |||
| } | |||
| export default translation | |||
| @@ -183,6 +183,7 @@ const translation = { | |||
| byCategories: 'PAR CATÉGORIES', | |||
| searchAllTemplate: 'Rechercher dans tous les modèles...', | |||
| }, | |||
| showMyCreatedAppsOnly: 'Afficher uniquement mes applications créées', | |||
| } | |||
| export default translation | |||
| @@ -183,6 +183,7 @@ const translation = { | |||
| byCategories: 'श्रेणियों द्वारा', | |||
| searchAllTemplate: 'सभी टेम्पलेट्स खोजें...', | |||
| }, | |||
| showMyCreatedAppsOnly: 'केवल मेरे बनाए गए ऐप्स दिखाएं', | |||
| } | |||
| export default translation | |||
| @@ -195,6 +195,7 @@ const translation = { | |||
| byCategories: 'PER CATEGORIE', | |||
| searchAllTemplate: 'Cerca in tutti i modelli...', | |||
| }, | |||
| showMyCreatedAppsOnly: 'Mostra solo le mie app create', | |||
| } | |||
| export default translation | |||
| @@ -184,6 +184,7 @@ const translation = { | |||
| byCategories: 'カテゴリ別', | |||
| searchAllTemplate: 'すべてのテンプレートを検索...', | |||
| }, | |||
| showMyCreatedAppsOnly: '自分が作成したアプリ', | |||
| } | |||
| export default translation | |||
| @@ -179,6 +179,7 @@ const translation = { | |||
| byCategories: '카테고리별', | |||
| searchAllTemplate: '모든 템플릿 검색...', | |||
| }, | |||
| showMyCreatedAppsOnly: '내가 만든 앱만 보기', | |||
| } | |||
| export default translation | |||
| @@ -190,6 +190,7 @@ const translation = { | |||
| searchAllTemplate: 'Przeszukaj wszystkie szablony...', | |||
| byCategories: 'WEDŁUG KATEGORII', | |||
| }, | |||
| showMyCreatedAppsOnly: 'Pokaż tylko moje utworzone aplikacje', | |||
| } | |||
| export default translation | |||
| @@ -183,6 +183,7 @@ const translation = { | |||
| searchAllTemplate: 'Pesquisar todos os modelos...', | |||
| byCategories: 'POR CATEGORIAS', | |||
| }, | |||
| showMyCreatedAppsOnly: 'Mostrar apenas meus aplicativos criados', | |||
| } | |||
| export default translation | |||
| @@ -183,6 +183,7 @@ const translation = { | |||
| searchAllTemplate: 'Căutați toate șabloanele...', | |||
| byCategories: 'DUPĂ CATEGORII', | |||
| }, | |||
| showMyCreatedAppsOnly: 'Afișează doar aplicațiile create de mine', | |||
| } | |||
| export default translation | |||
| @@ -183,6 +183,7 @@ const translation = { | |||
| searchAllTemplate: 'Поиск по всем шаблонам...', | |||
| byCategories: 'ПО КАТЕГОРИЯМ', | |||
| }, | |||
| showMyCreatedAppsOnly: 'Показать только созданные мной приложения', | |||
| } | |||
| export default translation | |||
| @@ -183,6 +183,7 @@ const translation = { | |||
| byCategories: 'PO KATEGORIJAH', | |||
| searchAllTemplate: 'Preišči vse predloge ...', | |||
| }, | |||
| showMyCreatedAppsOnly: 'Prikaži samo aplikacije, ki sem jih ustvaril', | |||
| } | |||
| export default translation | |||
| @@ -179,6 +179,7 @@ const translation = { | |||
| searchAllTemplate: 'ค้นหาเทมเพลตทั้งหมด...', | |||
| byCategories: 'ตามหมวดหมู่', | |||
| }, | |||
| showMyCreatedAppsOnly: 'แสดงเฉพาะแอปที่ฉันสร้าง', | |||
| } | |||
| export default translation | |||
| @@ -179,6 +179,7 @@ const translation = { | |||
| searchAllTemplate: 'Tüm şablonlarda ara...', | |||
| byCategories: 'KATEGORILERE GÖRE', | |||
| }, | |||
| showMyCreatedAppsOnly: 'Sadece oluşturduğum uygulamaları göster', | |||
| } | |||
| export default translation | |||
| @@ -183,6 +183,7 @@ const translation = { | |||
| byCategories: 'ЗА КАТЕГОРІЯМИ', | |||
| searchAllTemplate: 'Пошук по всіх шаблонах...', | |||
| }, | |||
| showMyCreatedAppsOnly: 'Показати лише створені мною додатки', | |||
| } | |||
| export default translation | |||
| @@ -183,6 +183,7 @@ const translation = { | |||
| searchAllTemplate: 'Tìm kiếm tất cả các mẫu...', | |||
| byCategories: 'THEO DANH MỤC', | |||
| }, | |||
| showMyCreatedAppsOnly: 'Chỉ hiển thị ứng dụng do tôi tạo', | |||
| } | |||
| export default translation | |||
| @@ -170,6 +170,7 @@ const translation = { | |||
| }, | |||
| }, | |||
| openInExplore: '在“探索”中打开', | |||
| showMyCreatedAppsOnly: '我创建的', | |||
| } | |||
| export default translation | |||
| @@ -182,6 +182,7 @@ const translation = { | |||
| searchAllTemplate: '搜尋所有樣本...', | |||
| byCategories: '按類別', | |||
| }, | |||
| showMyCreatedAppsOnly: '我创建的', | |||
| } | |||
| export default translation | |||