diff --git a/README.md b/README.md index e3fd2d7..68cfbac 100644 --- a/README.md +++ b/README.md @@ -159,6 +159,7 @@ labels: - flame.type=application # "app" works too - flame.name=My container - flame.url=https://example.com + - flame.category=My category # Optional, default is "Docker" - flame.icon=icon-name # Optional, default is "docker" # - flame.icon=custom to make changes in app. ie: custom icon upload ``` diff --git a/client/src/components/Apps/AppForm/AppForm.tsx b/client/src/components/Apps/AppForm/AppForm.tsx index 2a659a4..d67fe4c 100644 --- a/client/src/components/Apps/AppForm/AppForm.tsx +++ b/client/src/components/Apps/AppForm/AppForm.tsx @@ -98,7 +98,7 @@ const AppForm = (props: ComponentProps): JSX.Element => { if (appData.categoryId === -1) { props.createNotification({ title: 'Error', - message: 'Please select category' + message: 'Please select a category' }) return; } diff --git a/client/src/components/Apps/AppTable/AppTable.tsx b/client/src/components/Apps/AppTable/AppTable.tsx index e93d520..2d467cb 100644 --- a/client/src/components/Apps/AppTable/AppTable.tsx +++ b/client/src/components/Apps/AppTable/AppTable.tsx @@ -162,7 +162,7 @@ const AppTable = (props: ComponentProps): JSX.Element => { style={style} > {category.name} - {!snapshot.isDragging && ( + {!snapshot.isDragging && category.id >= 0 && (
{ }; const instanceOfCategory = (object: any): object is Category => { - return "apps" in object; + return !("categoryId" in object); }; const goToUpdateMode = (data: Category | App): void => { diff --git a/client/src/components/Home/Home.tsx b/client/src/components/Home/Home.tsx index 5f5033a..495e408 100644 --- a/client/src/components/Home/Home.tsx +++ b/client/src/components/Home/Home.tsx @@ -152,7 +152,7 @@ const Home = (props: ComponentProps): JSX.Element => { category.isPinned) + ? appCategories.filter((category: Category) => category.isPinned && category.apps.length > 0) : searchInCategories(localSearch, appCategories) } apps={ @@ -181,7 +181,7 @@ const Home = (props: ComponentProps): JSX.Element => { category.isPinned) + ? bookmarkCategories.filter((category: Category) => category.isPinned && category.bookmarks.length > 0) : searchInCategories(localSearch, bookmarkCategories) } bookmarks={ diff --git a/controllers/apps.js b/controllers/apps.js index 6948401..ec7722b 100644 --- a/controllers/apps.js +++ b/controllers/apps.js @@ -5,6 +5,8 @@ const Config = require('../models/Config'); const { Sequelize } = require('sequelize'); const axios = require('axios'); const Logger = require('../utils/Logger'); +const Category = require('../models/Category'); +const { dockerDefaultCategory } = require('./category'); const logger = new Logger(); const k8s = require('@kubernetes/client-node'); @@ -89,7 +91,18 @@ exports.getApps = asyncWrapper(async (req, res, next) => { order: [[orderType, 'ASC']], }); +<<<<<<< HEAD containers = containers.filter((e) => Object.keys(e.Labels).length !== 0); +======= + const categories = await Category.findAll({ + where: { + type: 'apps' + }, + order: [[orderType, 'ASC']] + }); + + containers = containers.filter(e => Object.keys(e.Labels).length !== 0); +>>>>>>> e1a46b7 (Support for app categories in docker integration (#8)) const dockerApps = []; for (const container of containers) { const labels = container.Labels; @@ -99,6 +112,7 @@ exports.getApps = asyncWrapper(async (req, res, next) => { 'flame.url' in labels && /^app/.test(labels['flame.type']) ) { +<<<<<<< HEAD for (let i = 0; i < labels['flame.name'].split(';').length; i++) { const names = labels['flame.name'].split(';'); const urls = labels['flame.url'].split(';'); @@ -114,6 +128,19 @@ exports.getApps = asyncWrapper(async (req, res, next) => { icon: icons[i] || 'docker', }); } +======= + const app = { + name: labels['flame.name'], + url: labels['flame.url'], + icon: labels['flame.icon'] || 'docker', + categoryId: dockerDefaultCategory.id + } + if (labels['flame.category']) { + const category = categories.find(category => category.name.toUpperCase() === labels['flame.category'].toUpperCase()); + app.categoryId = category ? category.id : dockerDefaultCategory.id + } + dockerApps.push(app); +>>>>>>> e1a46b7 (Support for app categories in docker integration (#8)) } } diff --git a/controllers/category.js b/controllers/category.js index 39d208c..060013f 100644 --- a/controllers/category.js +++ b/controllers/category.js @@ -5,6 +5,14 @@ const Bookmark = require('../models/Bookmark'); const Config = require('../models/Config'); const { Sequelize } = require('sequelize'); +exports.dockerDefaultCategory = { + id: -2, + name: "Docker", + type: "apps", + isPinned: true, + orderId: 99, +}; + // @desc Create new category // @route POST /api/categories // @access Public @@ -73,6 +81,7 @@ exports.getCategories = asyncWrapper(async (req, res, next) => { ], order: [[orderType, 'ASC']], }); + categories.push(exports.dockerDefaultCategory); } res.status(200).json({ @@ -100,12 +109,16 @@ exports.getCategory = asyncWrapper(async (req, res, next) => { }); if (!category) { - return next( - new ErrorResponse( - `Category with id of ${req.params.id} was not found`, - 404 - ) - ); + if (req.params.id === exports.dockerDefaultCategory.id) { + category = exports.dockerDefaultCategory; + } else { + return next( + new ErrorResponse( + `Category with id of ${req.params.id} was not found`, + 404 + ) + ); + } } res.status(200).json({ diff --git a/models/Category.js b/models/Category.js index 4256d21..05b4593 100644 --- a/models/Category.js +++ b/models/Category.js @@ -9,7 +9,7 @@ const Category = sequelize.define('Category', { type: { type: DataTypes.STRING, allowNull: false, - defaultValue: 'bookmark' // Default value for database migration only + defaultValue: 'bookmarks' // Default value for database migration only }, isPinned: { type: DataTypes.BOOLEAN,