mirror of
				https://github.com/langgenius/dify.git
				synced 2025-11-03 20:33:00 +00:00 
			
		
		
		
	feat: Add filter to show only apps created by the user (#11968)
This commit is contained in:
		
							parent
							
								
									a2105634a4
								
							
						
					
					
						commit
						2b1a32fd9c
					
				@ -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
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user