소스 검색

feat: Add filter to show only apps created by the user (#11968)

Shun Miyazawa 3 달 전
부모
커밋
2b1a32fd9c

+ 2 - 1
api/controllers/console/app/app.py

@@ -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}
 

+ 4 - 1
api/services/app_service.py

@@ -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}%"))

+ 11 - 2
web/app/(commonLayout)/apps/Apps.tsx

@@ -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

+ 1 - 0
web/i18n/de-DE/app.ts

@@ -190,6 +190,7 @@ const translation = {
     byCategories: 'NACH KATEGORIEN',
     searchAllTemplate: 'Alle Vorlagen durchsuchen...',
   },
+  showMyCreatedAppsOnly: 'Nur meine erstellten Apps anzeigen',
 }
 
 export default translation

+ 1 - 0
web/i18n/en-US/app.ts

@@ -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

+ 1 - 0
web/i18n/es-ES/app.ts

@@ -183,6 +183,7 @@ const translation = {
     byCategories: 'POR CATEGORÍAS',
     searchAllTemplate: 'Buscar todas las plantillas...',
   },
+  showMyCreatedAppsOnly: 'Mostrar solo mis aplicaciones creadas',
 }
 
 export default translation

+ 1 - 0
web/i18n/fa-IR/app.ts

@@ -183,6 +183,7 @@ const translation = {
     byCategories: 'بر اساس دسته بندی ها',
     searchAllTemplate: 'همه قالب ها را جستجو کنید...',
   },
+  showMyCreatedAppsOnly: 'فقط برنامه‌های ایجاد شده توسط من را نشان بده',
 }
 
 export default translation

+ 1 - 0
web/i18n/fr-FR/app.ts

@@ -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

+ 1 - 0
web/i18n/hi-IN/app.ts

@@ -183,6 +183,7 @@ const translation = {
     byCategories: 'श्रेणियों द्वारा',
     searchAllTemplate: 'सभी टेम्पलेट्स खोजें...',
   },
+  showMyCreatedAppsOnly: 'केवल मेरे बनाए गए ऐप्स दिखाएं',
 }
 
 export default translation

+ 1 - 0
web/i18n/it-IT/app.ts

@@ -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

+ 1 - 0
web/i18n/ja-JP/app.ts

@@ -184,6 +184,7 @@ const translation = {
     byCategories: 'カテゴリ別',
     searchAllTemplate: 'すべてのテンプレートを検索...',
   },
+  showMyCreatedAppsOnly: '自分が作成したアプリ',
 }
 
 export default translation

+ 1 - 0
web/i18n/ko-KR/app.ts

@@ -179,6 +179,7 @@ const translation = {
     byCategories: '카테고리별',
     searchAllTemplate: '모든 템플릿 검색...',
   },
+  showMyCreatedAppsOnly: '내가 만든 앱만 보기',
 }
 
 export default translation

+ 1 - 0
web/i18n/pl-PL/app.ts

@@ -190,6 +190,7 @@ const translation = {
     searchAllTemplate: 'Przeszukaj wszystkie szablony...',
     byCategories: 'WEDŁUG KATEGORII',
   },
+  showMyCreatedAppsOnly: 'Pokaż tylko moje utworzone aplikacje',
 }
 
 export default translation

+ 1 - 0
web/i18n/pt-BR/app.ts

@@ -183,6 +183,7 @@ const translation = {
     searchAllTemplate: 'Pesquisar todos os modelos...',
     byCategories: 'POR CATEGORIAS',
   },
+  showMyCreatedAppsOnly: 'Mostrar apenas meus aplicativos criados',
 }
 
 export default translation

+ 1 - 0
web/i18n/ro-RO/app.ts

@@ -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

+ 1 - 0
web/i18n/ru-RU/app.ts

@@ -183,6 +183,7 @@ const translation = {
     searchAllTemplate: 'Поиск по всем шаблонам...',
     byCategories: 'ПО КАТЕГОРИЯМ',
   },
+  showMyCreatedAppsOnly: 'Показать только созданные мной приложения',
 }
 
 export default translation

+ 1 - 0
web/i18n/sl-SI/app.ts

@@ -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

+ 1 - 0
web/i18n/th-TH/app.ts

@@ -179,6 +179,7 @@ const translation = {
     searchAllTemplate: 'ค้นหาเทมเพลตทั้งหมด...',
     byCategories: 'ตามหมวดหมู่',
   },
+  showMyCreatedAppsOnly: 'แสดงเฉพาะแอปที่ฉันสร้าง',
 }
 
 export default translation

+ 1 - 0
web/i18n/tr-TR/app.ts

@@ -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

+ 1 - 0
web/i18n/uk-UA/app.ts

@@ -183,6 +183,7 @@ const translation = {
     byCategories: 'ЗА КАТЕГОРІЯМИ',
     searchAllTemplate: 'Пошук по всіх шаблонах...',
   },
+  showMyCreatedAppsOnly: 'Показати лише створені мною додатки',
 }
 
 export default translation

+ 1 - 0
web/i18n/vi-VN/app.ts

@@ -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

+ 1 - 0
web/i18n/zh-Hans/app.ts

@@ -170,6 +170,7 @@ const translation = {
     },
   },
   openInExplore: '在“探索”中打开',
+  showMyCreatedAppsOnly: '我创建的',
 }
 
 export default translation

+ 1 - 0
web/i18n/zh-Hant/app.ts

@@ -182,6 +182,7 @@ const translation = {
     searchAllTemplate: '搜尋所有樣本...',
     byCategories: '按類別',
   },
+  showMyCreatedAppsOnly: '我创建的',
 }
 
 export default translation