Compare commits

...
13 Commits
34 changed files with 5444 additions and 63 deletions
+2 -2
View File
@@ -15,13 +15,13 @@ type: application
# This is the chart version. This version number should be incremented each time you make changes # This is the chart version. This version number should be incremented each time you make changes
# to the chart and its templates, including the app version. # to the chart and its templates, including the app version.
# Versions are expected to follow Semantic Versioning (https://semver.org/) # Versions are expected to follow Semantic Versioning (https://semver.org/)
version: 0.1.28 version: 0.1.31
# This is the version number of the application being deployed. This version number should be # This is the version number of the application being deployed. This version number should be
# incremented each time you make changes to the application. Versions are not expected to # incremented each time you make changes to the application. Versions are not expected to
# follow Semantic Versioning. They should reflect the version the application is using. # follow Semantic Versioning. They should reflect the version the application is using.
# It is recommended to use it with quotes. # It is recommended to use it with quotes.
appVersion: "1.17.1" appVersion: "1.17.4"
dependencies: dependencies:
- alias: postgresql - alias: postgresql
+6 -2
View File
@@ -14,11 +14,15 @@ If you want to fully uninstall this chart including the data, follow [these step
## Usage ## Usage
If you just want to spin up an instance using help, please see [these docs](https://docs.planka.cloud/docs/installation/kubernetes/helm_chart/). If you want to make changes to the chart locally, and deploy them, see the below section.
## Local Building and Using the Chart
The basic usage of the chart can be found below: The basic usage of the chart can be found below:
```bash ```bash
git clone https://github.com/Chris-Greaves/planka-helm-chart.git git clone https://github.com/plankanban/planka.git
cd planka-helm-chart cd planka/charts/planka
helm dependency build helm dependency build
export SECRETKEY=$(openssl rand -hex 64) export SECRETKEY=$(openssl rand -hex 64)
helm install planka . --set secretkey=$SECRETKEY \ helm install planka . --set secretkey=$SECRETKEY \
+9 -1
View File
@@ -64,8 +64,16 @@ spec:
{{- toYaml .Values.resources | nindent 12 }} {{- toYaml .Values.resources | nindent 12 }}
env: env:
{{- if not .Values.postgresql.enabled }} {{- if not .Values.postgresql.enabled }}
{{- if .Values.existingDburlSecret }}
- name: DATABASE_URL - name: DATABASE_URL
value: {{ required "If the included postgresql deployment is disabled you need to define a Database URL in 'dburl'" .Values.dburl }} valueFrom:
secretKeyRef:
name: .Values.existingDburlSecret
key: uri
{{- else }}
- name: DATABASE_URL
value: {{ required "If the included postgresql deployment is disabled you need to provide an existing secret in .Values.existingDburlSecret or define a Database URL in 'dburl'" .Values.dburl }}
{{- end }}
{{- else }} {{- else }}
- name: DATABASE_URL - name: DATABASE_URL
valueFrom: valueFrom:
+7 -1
View File
@@ -105,9 +105,15 @@ postgresql:
serviceBindings: serviceBindings:
enabled: true enabled: true
## Set this if you disable the built-in postgresql deployment ## Set this or existingDburlSecret if you disable the built-in postgresql deployment
dburl: dburl:
## @param existingDburlSecret Name of an existing secret containing a DBurl connection string
## NOTE: Must contain key `uri`
## NOTE: When it's set, the `dburl` parameter is ignored
##
existingDburlSecret: ""
## PVC-based data storage configuration ## PVC-based data storage configuration
persistence: persistence:
enabled: false enabled: false
+1 -1
View File
@@ -1 +1 @@
REACT_APP_VERSION=1.17.1 REACT_APP_VERSION=1.17.4
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 434 KiB

Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -57,6 +57,7 @@ const DescriptionEdit = React.forwardRef(({ children, defaultValue, onUpdate },
const mdEditorOptions = useMemo( const mdEditorOptions = useMemo(
() => ({ () => ({
autoDownloadFontAwesome: false,
autofocus: true, autofocus: true,
spellChecker: false, spellChecker: false,
status: false, status: false,
@@ -3,6 +3,7 @@ import React, { useCallback } from 'react';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { Button } from 'semantic-ui-react'; import { Button } from 'semantic-ui-react';
import { Popup } from '../../lib/custom-ui';
import { useSteps } from '../../hooks'; import { useSteps } from '../../hooks';
import User from '../User'; import User from '../User';
@@ -19,6 +20,7 @@ const ActionsStep = React.memo(
({ ({
membership, membership,
permissionsSelectStep, permissionsSelectStep,
title,
leaveButtonContent, leaveButtonContent,
leaveConfirmationTitle, leaveConfirmationTitle,
leaveConfirmationContent, leaveConfirmationContent,
@@ -31,6 +33,7 @@ const ActionsStep = React.memo(
canLeave, canLeave,
onUpdate, onUpdate,
onDelete, onDelete,
onBack,
onClose, onClose,
}) => { }) => {
const [t] = useTranslation(); const [t] = useTranslation();
@@ -53,6 +56,11 @@ const ActionsStep = React.memo(
[onUpdate], [onUpdate],
); );
const handleDeleteConfirm = useCallback(() => {
onDelete();
onClose();
}, [onDelete, onClose]);
if (step) { if (step) {
switch (step.type) { switch (step.type) {
case StepTypes.EDIT_PERMISSIONS: { case StepTypes.EDIT_PERMISSIONS: {
@@ -81,7 +89,7 @@ const ActionsStep = React.memo(
? leaveConfirmationButtonContent ? leaveConfirmationButtonContent
: deleteConfirmationButtonContent : deleteConfirmationButtonContent
} }
onConfirm={onDelete} onConfirm={handleDeleteConfirm}
onBack={handleBack} onBack={handleBack}
/> />
); );
@@ -89,7 +97,7 @@ const ActionsStep = React.memo(
} }
} }
return ( const contentNode = (
<> <>
<span className={styles.user}> <span className={styles.user}>
<User name={membership.user.name} avatarUrl={membership.user.avatarUrl} size="large" /> <User name={membership.user.name} avatarUrl={membership.user.avatarUrl} size="large" />
@@ -125,12 +133,26 @@ const ActionsStep = React.memo(
)} )}
</> </>
); );
return onBack ? (
<>
<Popup.Header onBack={onBack}>
{t(title, {
context: 'title',
})}
</Popup.Header>
<Popup.Content>{contentNode}</Popup.Content>
</>
) : (
contentNode
);
}, },
); );
ActionsStep.propTypes = { ActionsStep.propTypes = {
membership: PropTypes.object.isRequired, // eslint-disable-line react/forbid-prop-types membership: PropTypes.object.isRequired, // eslint-disable-line react/forbid-prop-types
permissionsSelectStep: PropTypes.elementType, permissionsSelectStep: PropTypes.elementType,
title: PropTypes.string,
leaveButtonContent: PropTypes.string, leaveButtonContent: PropTypes.string,
leaveConfirmationTitle: PropTypes.string, leaveConfirmationTitle: PropTypes.string,
leaveConfirmationContent: PropTypes.string, leaveConfirmationContent: PropTypes.string,
@@ -143,11 +165,13 @@ ActionsStep.propTypes = {
canLeave: PropTypes.bool.isRequired, canLeave: PropTypes.bool.isRequired,
onUpdate: PropTypes.func, onUpdate: PropTypes.func,
onDelete: PropTypes.func.isRequired, onDelete: PropTypes.func.isRequired,
onBack: PropTypes.func,
onClose: PropTypes.func.isRequired, onClose: PropTypes.func.isRequired,
}; };
ActionsStep.defaultProps = { ActionsStep.defaultProps = {
permissionsSelectStep: undefined, permissionsSelectStep: undefined,
title: 'common.memberActions',
leaveButtonContent: 'action.leaveBoard', leaveButtonContent: 'action.leaveBoard',
leaveConfirmationTitle: 'common.leaveBoard', leaveConfirmationTitle: 'common.leaveBoard',
leaveConfirmationContent: 'common.areYouSureYouWantToLeaveBoard', leaveConfirmationContent: 'common.areYouSureYouWantToLeaveBoard',
@@ -157,6 +181,7 @@ ActionsStep.defaultProps = {
deleteConfirmationContent: 'common.areYouSureYouWantToRemoveThisMemberFromBoard', deleteConfirmationContent: 'common.areYouSureYouWantToRemoveThisMemberFromBoard',
deleteConfirmationButtonContent: 'action.removeMember', deleteConfirmationButtonContent: 'action.removeMember',
onUpdate: undefined, onUpdate: undefined,
onBack: undefined,
}; };
export default ActionsStep; export default ActionsStep;
@@ -5,10 +5,10 @@ import { usePopup } from '../../lib/popup';
import AddStep from './AddStep'; import AddStep from './AddStep';
import ActionsStep from './ActionsStep'; import ActionsStep from './ActionsStep';
import MembershipsStep from './MembershipsStep';
import User from '../User'; import User from '../User';
import styles from './Memberships.module.scss'; import styles from './Memberships.module.scss';
import MembershipsStep from './MembershipsStep';
const MAX_MEMBERS = 6; const MAX_MEMBERS = 6;
@@ -17,7 +17,9 @@ const Memberships = React.memo(
items, items,
allUsers, allUsers,
permissionsSelectStep, permissionsSelectStep,
title,
addTitle, addTitle,
actionsTitle,
leaveButtonContent, leaveButtonContent,
leaveConfirmationTitle, leaveConfirmationTitle,
leaveConfirmationContent, leaveConfirmationContent,
@@ -73,6 +75,8 @@ const Memberships = React.memo(
<MembershipsPopup <MembershipsPopup
items={items} items={items}
permissionsSelectStep={permissionsSelectStep} permissionsSelectStep={permissionsSelectStep}
title={title}
actionsTitle={actionsTitle}
leaveButtonContent={leaveButtonContent} leaveButtonContent={leaveButtonContent}
leaveConfirmationTitle={leaveConfirmationTitle} leaveConfirmationTitle={leaveConfirmationTitle}
leaveConfirmationContent={leaveConfirmationContent} leaveConfirmationContent={leaveConfirmationContent}
@@ -87,7 +91,7 @@ const Memberships = React.memo(
onDelete={onDelete} onDelete={onDelete}
> >
<Button icon className={styles.addUser}> <Button icon className={styles.addUser}>
+ {remainMembersCount < 99 ? remainMembersCount : 99} +{remainMembersCount < 99 ? remainMembersCount : 99}
</Button> </Button>
</MembershipsPopup> </MembershipsPopup>
)} )}
@@ -113,7 +117,9 @@ Memberships.propTypes = {
allUsers: PropTypes.array.isRequired, allUsers: PropTypes.array.isRequired,
/* eslint-enable react/forbid-prop-types */ /* eslint-enable react/forbid-prop-types */
permissionsSelectStep: PropTypes.elementType, permissionsSelectStep: PropTypes.elementType,
title: PropTypes.string,
addTitle: PropTypes.string, addTitle: PropTypes.string,
actionsTitle: PropTypes.string,
leaveButtonContent: PropTypes.string, leaveButtonContent: PropTypes.string,
leaveConfirmationTitle: PropTypes.string, leaveConfirmationTitle: PropTypes.string,
leaveConfirmationContent: PropTypes.string, leaveConfirmationContent: PropTypes.string,
@@ -131,7 +137,9 @@ Memberships.propTypes = {
Memberships.defaultProps = { Memberships.defaultProps = {
permissionsSelectStep: undefined, permissionsSelectStep: undefined,
title: undefined,
addTitle: undefined, addTitle: undefined,
actionsTitle: undefined,
leaveButtonContent: undefined, leaveButtonContent: undefined,
leaveConfirmationTitle: undefined, leaveConfirmationTitle: undefined,
leaveConfirmationContent: undefined, leaveConfirmationContent: undefined,
@@ -1,15 +1,20 @@
import React, { useCallback, useState } from 'react'; import React, { useCallback } from 'react';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import { useTranslation } from 'react-i18next';
import BoardMembershipsStep from '../BoardMembershipsStep/BoardMembershipsStep'; import { useSteps } from '../../hooks';
import ActionsStep from './ActionsStep'; import ActionsStep from './ActionsStep';
import { Popup } from '../../lib/custom-ui'; import BoardMembershipsStep from '../BoardMembershipsStep';
const StepTypes = {
EDIT: 'EDIT',
};
const MembershipsStep = React.memo( const MembershipsStep = React.memo(
({ ({
items, items,
permissionsSelectStep, permissionsSelectStep,
title,
actionsTitle,
leaveButtonContent, leaveButtonContent,
leaveConfirmationTitle, leaveConfirmationTitle,
leaveConfirmationContent, leaveConfirmationContent,
@@ -24,49 +29,54 @@ const MembershipsStep = React.memo(
onDelete, onDelete,
onClose, onClose,
}) => { }) => {
const [t] = useTranslation(); const [step, openStep, handleBack] = useSteps();
const [editingItem, setEditingItem] = useState(); const handleUserSelect = useCallback(
(userId) => {
const handleUserClick = useCallback( openStep(StepTypes.EDIT, {
(id) => { userId,
setEditingItem(items.find((item) => item.user.id === id)); });
}, },
[setEditingItem, items], [openStep],
); );
if (editingItem) { if (step && step.type === StepTypes.EDIT) {
return ( const currentItem = items.find((item) => item.userId === step.params.userId);
<>
<Popup.Header onBack={() => setEditingItem(null)}>{t('common.memberInfo')}</Popup.Header> if (currentItem) {
<Popup.Content> return (
<ActionsStep <ActionsStep
membership={editingItem} membership={currentItem}
permissionsSelectStep={permissionsSelectStep} permissionsSelectStep={permissionsSelectStep}
leaveButtonContent={leaveButtonContent} title={actionsTitle}
leaveConfirmationTitle={leaveConfirmationTitle} leaveButtonContent={leaveButtonContent}
leaveConfirmationContent={leaveConfirmationContent} leaveConfirmationTitle={leaveConfirmationTitle}
leaveConfirmationButtonContent={leaveConfirmationButtonContent} leaveConfirmationContent={leaveConfirmationContent}
deleteButtonContent={deleteButtonContent} leaveConfirmationButtonContent={leaveConfirmationButtonContent}
deleteConfirmationTitle={deleteConfirmationTitle} deleteButtonContent={deleteButtonContent}
deleteConfirmationContent={deleteConfirmationContent} deleteConfirmationTitle={deleteConfirmationTitle}
deleteConfirmationButtonContent={deleteConfirmationButtonContent} deleteConfirmationContent={deleteConfirmationContent}
canEdit={canEdit} deleteConfirmationButtonContent={deleteConfirmationButtonContent}
canLeave={canLeave} canEdit={canEdit}
onUpdate={onUpdate} canLeave={canLeave}
onDelete={onDelete} onUpdate={(data) => onUpdate(currentItem.id, data)}
onClose={onClose} onDelete={() => onDelete(currentItem.id)}
/> onBack={handleBack}
</Popup.Content> onClose={onClose}
</> />
); );
}
openStep(null);
} }
return ( return (
// FIXME: hack
<BoardMembershipsStep <BoardMembershipsStep
items={items} items={items}
currentUserIds={[]} currentUserIds={[]}
onUserSelect={handleUserClick} title={title}
onUserSelect={handleUserSelect}
onUserDeselect={() => {}} onUserDeselect={() => {}}
/> />
); );
@@ -76,6 +86,8 @@ const MembershipsStep = React.memo(
MembershipsStep.propTypes = { MembershipsStep.propTypes = {
items: PropTypes.array.isRequired, // eslint-disable-line react/forbid-prop-types items: PropTypes.array.isRequired, // eslint-disable-line react/forbid-prop-types
permissionsSelectStep: PropTypes.elementType, permissionsSelectStep: PropTypes.elementType,
title: PropTypes.string,
actionsTitle: PropTypes.string,
leaveButtonContent: PropTypes.string, leaveButtonContent: PropTypes.string,
leaveConfirmationTitle: PropTypes.string, leaveConfirmationTitle: PropTypes.string,
leaveConfirmationContent: PropTypes.string, leaveConfirmationContent: PropTypes.string,
@@ -93,14 +105,16 @@ MembershipsStep.propTypes = {
MembershipsStep.defaultProps = { MembershipsStep.defaultProps = {
permissionsSelectStep: undefined, permissionsSelectStep: undefined,
leaveButtonContent: 'action.leaveBoard', title: undefined,
leaveConfirmationTitle: 'common.leaveBoard', actionsTitle: undefined,
leaveConfirmationContent: 'common.areYouSureYouWantToLeaveBoard', leaveButtonContent: undefined,
leaveConfirmationButtonContent: 'action.leaveBoard', leaveConfirmationTitle: undefined,
deleteButtonContent: 'action.removeFromBoard', leaveConfirmationContent: undefined,
deleteConfirmationTitle: 'common.removeMember', leaveConfirmationButtonContent: undefined,
deleteConfirmationContent: 'common.areYouSureYouWantToRemoveThisMemberFromBoard', deleteButtonContent: undefined,
deleteConfirmationButtonContent: 'action.removeMember', deleteConfirmationTitle: undefined,
deleteConfirmationContent: undefined,
deleteConfirmationButtonContent: undefined,
onUpdate: undefined, onUpdate: undefined,
}; };
@@ -12,7 +12,9 @@ const ManagersPane = React.memo(({ items, allUsers, onCreate, onDelete }) => {
<Memberships <Memberships
items={items} items={items}
allUsers={allUsers} allUsers={allUsers}
title="common.managers"
addTitle="common.addManager" addTitle="common.addManager"
actionsTitle="common.managerActions"
leaveButtonContent="action.leaveProject" leaveButtonContent="action.leaveProject"
leaveConfirmationTitle="common.leaveProject" leaveConfirmationTitle="common.leaveProject"
leaveConfirmationContent="common.areYouSureYouWantToLeaveProject" leaveConfirmationContent="common.areYouSureYouWantToLeaveProject"
+1
View File
@@ -13,6 +13,7 @@ import 'react-datepicker/dist/react-datepicker.css';
import 'photoswipe/dist/photoswipe.css'; import 'photoswipe/dist/photoswipe.css';
import 'easymde/dist/easymde.min.css'; import 'easymde/dist/easymde.min.css';
import '../lib/custom-ui/styles.css'; import '../lib/custom-ui/styles.css';
import '../assets/css/font-awesome.css';
import '../styles.module.scss'; import '../styles.module.scss';
function Root({ store, history }) { function Root({ store, history }) {
+252
View File
@@ -0,0 +1,252 @@
import dateFns from 'date-fns/locale/bg';
export default {
dateFns,
format: {
date: 'd.MM.yyyy',
time: 'p',
dateTime: '$t(format:date) $t(format:time)',
longDate: 'd. MMM',
longDateTime: "d. MMMM 'в' p",
fullDate: 'd. MMM. y',
fullDateTime: "d. MMMM. y 'в' p",
},
translation: {
common: {
aboutPlanka: 'За Planka',
account: 'Акаунт',
actions: 'Действия',
addAttachment_title: 'Добавяне на прикачен файл',
addComment: 'Добавяне на коментар',
addManager_title: 'Добавяне на мениджър',
addMember_title: 'Добавяне на член',
addUser_title: 'Добавяне на потребител',
administrator: 'Администратор',
all: 'Всички',
allChangesWillBeAutomaticallySavedAfterConnectionRestored:
'Всички промени ще бъдат автоматично запазени<br />след възстановяване на връзката.',
areYouSureYouWantToDeleteThisAttachment:
'Сигурни ли сте, че искате да изтриете този прикачен файл?',
areYouSureYouWantToDeleteThisBoard: 'Сигурни ли сте, че искате да изтриете това табло?',
areYouSureYouWantToDeleteThisCard: 'Сигурни ли сте, че искате да изтриете тази карта?',
areYouSureYouWantToDeleteThisComment: 'Сигурни ли сте, че искате да изтриете този коментар?',
areYouSureYouWantToDeleteThisLabel: 'Сигурни ли сте, че искате да изтриете този етикет?',
areYouSureYouWantToDeleteThisList: 'Сигурни ли сте, че искате да изтриете този списък?',
areYouSureYouWantToDeleteThisProject: 'Сигурни ли сте, че искате да изтриете този проект?',
areYouSureYouWantToDeleteThisTask: 'Сигурни ли сте, че искате да изтриете тази задача?',
areYouSureYouWantToDeleteThisUser: 'Сигурни ли сте, че искате да изтриете този потребител?',
areYouSureYouWantToLeaveBoard: 'Сигурни ли сте, че искате да напуснете таблото?',
areYouSureYouWantToLeaveProject: 'Сигурни ли сте, че искате да напуснете проекта?',
areYouSureYouWantToRemoveThisManagerFromProject:
'Сигурни ли сте, че искате да премахнете този мениджър от проекта?',
areYouSureYouWantToRemoveThisMemberFromBoard:
'Сигурни ли сте, че искате да премахнете този член от таблото?',
attachment: 'Прикачен файл',
attachments: 'Прикачени файлове',
authentication: 'Удостоверяване',
background: 'Фон',
board: 'Табло',
boardNotFound_title: 'Таблото не е намерено',
canComment: 'може да коментира',
canEditContentOfBoard: 'може да редактира съдържание на таблото',
canOnlyViewBoard: 'може само да преглежда таблото',
cardActions_title: 'Действия с карта',
cardNotFound_title: 'Картата не може да бъде открита',
cardOrActionAreDeleted: 'Картата или действието са изтрити.',
color: 'Цвят',
copy_inline: 'копирай',
createBoard_title: 'Създаване на табло',
createLabel_title: 'Създаване на етикет',
createNewOneOrSelectExistingOne: 'Създайте нов или изберете<br/>съществуващ.',
createProject_title: 'Създаване на проект',
createTextFile_title: 'Създаване на текстов файл',
currentPassword: 'Текуща парола',
dangerZone_title: 'Опасна зона',
date: 'Дата',
dueDate: 'Дата на падежа',
dueDate_title: 'Краен срок',
deleteAttachment_title: 'Изтриване на прикачен файл',
deleteBoard_title: 'Изтриване на табло',
deleteCard_title: 'Изтриване на карта',
deleteComment_title: 'Изтриване на коментар',
deleteLabel_title: 'Изтриване на етикета',
deleteList_title: 'Изтриване на списък',
deleteProject_title: 'Изтриване на проект',
deleteTask_title: 'Изтриване на задача',
deleteUser_title: 'Изтриване на потребител',
description: 'Описание',
detectAutomatically: 'Aвтоматично откриване',
dropFileToUpload: 'Пуснете файл за качване',
editor: 'Редактор',
editAttachment_title: 'Редактирай прикачения файл',
editAvatar_title: 'Редактиране на аватар',
editBoard_title: 'Редактиране на табло',
editDueDate_title: 'Редактиране на дата на падеж',
editEmail_title: 'Редактиране на имейл',
editInformation_title: 'Редактиране на информация',
editLabel_title: 'Редактиране на табло',
editPassword_title: 'Редактиране на парола',
editPermissions_title: 'Редактиране на права',
editStopwatch_title: 'Редактиране на Хронометър',
editUsername_title: 'Редактиране на потребителско име',
email: 'Имейл',
emailAlreadyInUse: 'Имейлът вече се използва',
enterCardTitle: 'Въведете заглавие на картата... [Ctrl+Enter] за автоматично отваряне.',
enterDescription: 'Въведете описание...',
enterFilename: 'Въведете име на файла',
enterListTitle: 'Въведете заглавие на списък...',
enterProjectTitle: 'Въведете заглавие на проекта',
enterTaskDescription: 'Въведете описание на задачата...',
filterByLabels_title: 'Филтриране по етикети',
filterByMembers_title: 'Филтриране по членове',
fromComputer_title: 'От компютър',
fromTrello: 'От Trello',
general: 'Общ',
hours: 'Часове',
importBoard_title: 'Импортиране на табло',
invalidCurrentPassword: 'Невалидна текуща парола',
labels: 'Етикети',
language: 'Език',
leaveBoard_title: 'Напуснете таблото',
leaveProject_title: 'Напуснете проекта',
list: 'Списък',
listActions_title: 'Списък с действия',
managers: 'Мениджъри',
managerActions_title: 'Действия с мениджъри',
members: 'Членове',
memberActions_title: 'Действия с членове',
minutes: 'Минути',
moveCard_title: 'Преместване на карта',
name: 'Име',
newestFirst: 'Първо най-новите',
newEmail: 'Нов имейл',
newPassword: 'Нова парола',
newUsername: 'Ново потребителско име',
noConnectionToServer: 'Няма връзка със сървъра',
noBoards: 'Няма табла',
noLists: 'Няма списъци',
noProjects: 'Няма проекти',
notifications: 'Уведомления',
noUnreadNotifications: 'Няма непрочетени известия.',
oldestFirst: 'Първо най-старите',
openBoard_title: 'Отворете табло',
optional_inline: 'по желание',
organization: 'Организация',
phone: 'Телефон',
preferences: 'Предпочитания',
pressPasteShortcutToAddAttachmentFromClipboard:
'Съвет: натиснете Ctrl-V (Cmd-V на Mac), за да добавите прикачен файл от клипборда',
project: 'Проект',
projectNotFound_title: 'Проектът не е намерен',
removeManager_title: 'Премахване на мениджър',
removeMember_title: 'Премахване на член',
searchLabels: 'Търсене на етикети...',
searchMembers: 'Търсене на членове...',
searchUsers: 'Търсене на потребители...',
searchCards: 'Търсене на карти...',
seconds: 'секунди',
selectBoard: 'Изберете табло',
selectList: 'Изберете списък',
selectPermissions_title: 'Изберете правата',
selectProject: 'Изберете проект',
settings: 'Настройки',
sortList_title: 'Сортиране на списък',
stopwatch: 'Хронометър',
subscribeToMyOwnCardsByDefault: 'Абонирайте се за собствените си карти по подразбиране',
taskActions_title: 'Действия със задачи',
tasks: 'Задачи',
thereIsNoPreviewAvailableForThisAttachment: 'Няма наличен преглед за този прикачен файл.',
time: 'Време',
title: 'Заглавие',
userActions_title: 'Потребителски действия',
userAddedThisCardToList: '<0>{{user}}</0><1> добави тази карта в {{list}}</1>',
userLeftNewCommentToCard: '{{user}} остави нов коментар «{{comment}}» в <2>{{card}}</2>',
userMovedCardFromListToList:
'{{user}} премести <2>{{card}}</2> от {{fromList}} към {{toList}}',
userMovedThisCardFromListToList:
'<0>{{user}}</0><1> премести тази карта от {{fromList}} към {{toList}}</1>',
username: 'Потребителско име',
usernameAlreadyInUse: 'Потребителското име вече се използва',
users: 'Потребители',
version: 'Версия',
viewer: 'Зрител',
writeComment: 'Напишете коментар...',
},
action: {
addAnotherCard: 'Добавяне на друга карта',
addAnotherList: 'Добавяне на друг списък',
addAnotherTask: 'Добавяне на друга задача',
addCard: 'Добавяне на карта',
addCard_title: 'Добавяне на карта',
addComment: 'Добавяне на коментар',
addList: 'Добавяне на списък',
addMember: 'Добавяне на член',
addMoreDetailedDescription: 'Добавяне на по-подробно описание',
addTask: 'Добавяне на задача',
addToCard: 'Добавяне към карта',
addUser: 'Добавяне на потребител',
createBoard: 'Създаване на табло',
createFile: 'Създаване на файл',
createLabel: 'Създаване на етикет',
createNewLabel: 'Създаване на нов етикет',
createProject: 'Създаване на проект',
delete: 'Изтриване',
deleteAttachment: 'Изтриване на прикачения файл',
deleteAvatar: 'Изтриване на аватар',
deleteBoard: 'Изтриване на табло',
deleteCard: 'Изтриване на карта',
deleteCard_title: 'Изтриване на карта',
deleteComment: 'Изтриване на коментара',
deleteImage: 'Изтриване на изображение',
deleteLabel: 'Изтриване на етикета',
deleteList: 'Изтриване на списък',
deleteList_title: 'Изтриване на списък',
deleteProject: 'Изтриване на проект',
deleteProject_title: 'Изтриване на проект',
deleteTask: 'Изтриване на задача',
deleteTask_title: 'Изтриване на задача',
deleteUser: 'Изтриване на потребител',
duplicate: 'Направи дубликат',
duplicateCard_title: 'Дублирана карта',
edit: 'Редактиране',
editDueDate_title: 'Редактиране на краен срок',
editDescription_title: 'Редактиране на описание',
editEmail_title: 'Редактиране на имейл',
editInformation_title: 'Редактиране на информация',
editPassword_title: 'Редактиране на парола',
editPermissions: 'Разрешения за редактиране',
editStopwatch_title: 'Редактиране на хронометър',
editTitle_title: 'Редактиране на заглавието',
editUsername_title: 'Редактиране на потребителско име',
hideDetails: 'Скриване на детайлите',
import: 'Импортиране',
leaveBoard: 'Напускане на дъската',
leaveProject: 'Напускане на проекта',
logOut_title: 'Излезте',
makeCover_title: 'Създаване на корица',
move: 'Преместване',
moveCard_title: 'Преместване на карта',
remove: 'Премахване',
removeBackground: 'Премахване на фона',
removeCover_title: 'Премахване на корицата',
removeFromBoard: 'Премахване от борда',
removeFromProject: 'Премахване от проекта',
removeManager: 'Премахване на мениджър',
removeMember: 'Премахване на член',
save: 'Запазване',
showAllAttachments: 'Показване на всички прикачени файлове ({{hidden}} скрити)',
showDetails: 'Показване на подробности',
showFewerAttachments: 'Показване на по-малко прикачени файлове',
sortList_title: 'Списък за сортиране',
start: 'Старт',
stop: 'Стоп',
subscribe: 'Абонирайте се',
unsubscribe: 'Отписване',
uploadNewAvatar: 'Качване на нов аватар',
uploadNewImage: 'Качване на ново изображение',
},
},
};
+8
View File
@@ -0,0 +1,8 @@
import login from './login';
export default {
language: 'bg',
country: 'bg',
name: 'Български',
embeddedLocale: login,
};
+22
View File
@@ -0,0 +1,22 @@
export default {
translation: {
common: {
emailOrUsername: 'Имейл или потребителско име',
invalidEmailOrUsername: 'Невалиден имейл или потребителско име',
invalidPassword: 'Невалидна парола',
logInToPlanka: 'Влезте в Planka',
noInternetConnection: 'Няма интернет връзка',
pageNotFound_title: 'Страницата не е намерена',
password: 'Парола',
projectManagement: 'Управление на проекти',
serverConnectionFailed: 'Неуспешна връзка със сървъра',
unknownError: 'Неизвестна грешка, опитайте отново по-късно',
useSingleSignOn: 'Използване на single sign-on',
},
action: {
logIn: 'Вход',
logInWithSSO: 'Вход чрез SSO',
},
},
};
+2 -1
View File
@@ -109,8 +109,9 @@ export default {
list: 'List', list: 'List',
listActions_title: 'List Actions', listActions_title: 'List Actions',
managers: 'Managers', managers: 'Managers',
memberInfo: 'Member Info', managerActions_title: 'Manager Actions',
members: 'Members', members: 'Members',
memberActions_title: 'Member Actions',
minutes: 'Minutes', minutes: 'Minutes',
moveCard_title: 'Move Card', moveCard_title: 'Move Card',
name: 'Name', name: 'Name',
+2
View File
@@ -1,3 +1,4 @@
import bg from './bg';
import cs from './cs'; import cs from './cs';
import da from './da'; import da from './da';
import de from './de'; import de from './de';
@@ -22,6 +23,7 @@ import uz from './uz';
import zh from './zh'; import zh from './zh';
const locales = [ const locales = [
bg,
cs, cs,
da, da,
de, de,
+6
View File
@@ -59,6 +59,7 @@ export default {
currentPassword: 'Password corrente', currentPassword: 'Password corrente',
dangerZone_title: 'Zona pericolosa', dangerZone_title: 'Zona pericolosa',
date: 'Data', date: 'Data',
dueDate: 'Data di scadenza',
dueDate_title: 'Data di scadenza', dueDate_title: 'Data di scadenza',
deleteAttachment_title: 'Elimina Allegato', deleteAttachment_title: 'Elimina Allegato',
deleteBoard_title: 'Elimina Bacheca', deleteBoard_title: 'Elimina Bacheca',
@@ -111,6 +112,7 @@ export default {
minutes: 'Minuti', minutes: 'Minuti',
moveCard_title: 'Sposta card', moveCard_title: 'Sposta card',
name: 'Nome', name: 'Nome',
newestFirst: 'Dal più recente',
newEmail: 'Nuova e-mail', newEmail: 'Nuova e-mail',
newPassword: 'Nuova password', newPassword: 'Nuova password',
newUsername: 'Nuovo username', newUsername: 'Nuovo username',
@@ -120,6 +122,7 @@ export default {
noProjects: 'No progetti', noProjects: 'No progetti',
notifications: 'Notifiche', notifications: 'Notifiche',
noUnreadNotifications: 'Nessuna notifica non letta.', noUnreadNotifications: 'Nessuna notifica non letta.',
oldestFirst: 'Dal meno recente',
openBoard_title: 'Bacheca aperta', openBoard_title: 'Bacheca aperta',
optional_inline: 'opzionale', optional_inline: 'opzionale',
organization: 'Organizazzione', organization: 'Organizazzione',
@@ -134,12 +137,14 @@ export default {
searchLabels: 'Cerca etichette...', searchLabels: 'Cerca etichette...',
searchMembers: 'Cerca membri...', searchMembers: 'Cerca membri...',
searchUsers: 'Cerca utenti...', searchUsers: 'Cerca utenti...',
searchCards: 'Cerca cards...',
seconds: 'Secondi', seconds: 'Secondi',
selectBoard: 'Seleziona bacheca', selectBoard: 'Seleziona bacheca',
selectList: 'Seleziona lista', selectList: 'Seleziona lista',
selectPermissions_title: 'Seleziona Permessi', selectPermissions_title: 'Seleziona Permessi',
selectProject: 'Seleziona progetto', selectProject: 'Seleziona progetto',
settings: 'Impostazioni', settings: 'Impostazioni',
sortList_title: 'Ordina',
stopwatch: 'Timer', stopwatch: 'Timer',
subscribeToMyOwnCardsByDefault: 'Abbonati alle mie card per impostazione predefinita', subscribeToMyOwnCardsByDefault: 'Abbonati alle mie card per impostazione predefinita',
taskActions_title: 'Task Azioni', taskActions_title: 'Task Azioni',
@@ -227,6 +232,7 @@ export default {
showAllAttachments: 'Mostra tutti gli allegati ({{hidden}} hidden)', showAllAttachments: 'Mostra tutti gli allegati ({{hidden}} hidden)',
showDetails: 'Mostra dettagli', showDetails: 'Mostra dettagli',
showFewerAttachments: 'Mostra meno allegati', showFewerAttachments: 'Mostra meno allegati',
sortList_title: 'Ordina',
start: 'Inizio', start: 'Inizio',
stop: 'Ferma', stop: 'Ferma',
subscribe: 'Iscriviti', subscribe: 'Iscriviti',
-1
View File
@@ -111,7 +111,6 @@ export default {
list: 'Lista', list: 'Lista',
listActions_title: 'Ações da Lista', listActions_title: 'Ações da Lista',
managers: 'Gerentes', managers: 'Gerentes',
memberInfo: 'Informações do Membro',
members: 'Membros', members: 'Membros',
minutes: 'Minutos', minutes: 'Minutos',
moveCard_title: 'Mover Cartão', moveCard_title: 'Mover Cartão',
+2
View File
@@ -142,6 +142,7 @@ export default {
searchLabels: 'Поиск меток...', searchLabels: 'Поиск меток...',
searchMembers: 'Поиск участников...', searchMembers: 'Поиск участников...',
searchUsers: 'Поиск пользователей...', searchUsers: 'Поиск пользователей...',
searchCards: 'Поиск карточек...',
seconds: 'Секунды', seconds: 'Секунды',
selectBoard: 'Выберите доску', selectBoard: 'Выберите доску',
selectList: 'Выберите список', selectList: 'Выберите список',
@@ -232,6 +233,7 @@ export default {
showAllAttachments: 'Показать все вложения ({{hidden}} скрыто)', showAllAttachments: 'Показать все вложения ({{hidden}} скрыто)',
showDetails: 'Показать подробности', showDetails: 'Показать подробности',
showFewerAttachments: 'Показать меньше вложений', showFewerAttachments: 'Показать меньше вложений',
sortList_title: 'Сортировать список',
start: 'Начать', start: 'Начать',
stop: 'Остановить', stop: 'Остановить',
subscribe: 'Подписаться', subscribe: 'Подписаться',
+6 -2
View File
@@ -101,7 +101,9 @@ export default class extends BaseModel {
} }
let doRegularSearch = true; let doRegularSearch = true;
if (re) { if (re) {
cardModels = cardModels.filter((cardModel) => re.test(cardModel.name)); cardModels = cardModels.filter(
(cardModel) => re.test(cardModel.name) || re.test(cardModel?.description),
);
doRegularSearch = false; doRegularSearch = false;
} else if (filterText.startsWith('!') && posSpace > 0) { } else if (filterText.startsWith('!') && posSpace > 0) {
const creatorUserId = User.findUsersFromText( const creatorUserId = User.findUsersFromText(
@@ -116,7 +118,9 @@ export default class extends BaseModel {
if (doRegularSearch) { if (doRegularSearch) {
const lowerCasedFilter = filterText.toLocaleLowerCase(); const lowerCasedFilter = filterText.toLocaleLowerCase();
cardModels = cardModels.filter( cardModels = cardModels.filter(
(cardModel) => cardModel.name.toLocaleLowerCase().indexOf(lowerCasedFilter) >= 0, (cardModel) =>
cardModel.name.toLocaleLowerCase().indexOf(lowerCasedFilter) >= 0 ||
cardModel.description?.toLocaleLowerCase().indexOf(lowerCasedFilter) >= 0,
); );
} }
} }
+1
View File
@@ -39,6 +39,7 @@ services:
# Email Notifications (https://nodemailer.com/smtp/) # Email Notifications (https://nodemailer.com/smtp/)
# - SMTP_HOST= # - SMTP_HOST=
# - SMTP_PORT=587 # - SMTP_PORT=587
# - SMTP_NAME=
# - SMTP_SECURE=true # - SMTP_SECURE=true
# - SMTP_USER= # - SMTP_USER=
# - SMTP_PASSWORD= # - SMTP_PASSWORD=
+1
View File
@@ -47,6 +47,7 @@ services:
# Email Notifications (https://nodemailer.com/smtp/) # Email Notifications (https://nodemailer.com/smtp/)
# - SMTP_HOST= # - SMTP_HOST=
# - SMTP_PORT=587 # - SMTP_PORT=587
# - SMTP_NAME=
# - SMTP_SECURE=true # - SMTP_SECURE=true
# - SMTP_USER= # - SMTP_USER=
# - SMTP_PASSWORD= # - SMTP_PASSWORD=
+2 -2
View File
@@ -1,12 +1,12 @@
{ {
"name": "planka", "name": "planka",
"version": "1.17.1", "version": "1.17.4",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "planka", "name": "planka",
"version": "1.17.1", "version": "1.17.4",
"hasInstallScript": true, "hasInstallScript": true,
"license": "AGPL-3.0", "license": "AGPL-3.0",
"dependencies": { "dependencies": {
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "planka", "name": "planka",
"version": "1.17.1", "version": "1.17.4",
"private": true, "private": true,
"homepage": "https://plankanban.github.io/planka", "homepage": "https://plankanban.github.io/planka",
"repository": { "repository": {
+1
View File
@@ -27,6 +27,7 @@ module.exports = function defineSmtpHook(sails) {
pool: true, pool: true,
host: sails.config.custom.smtpHost, host: sails.config.custom.smtpHost,
port: sails.config.custom.smtpPort, port: sails.config.custom.smtpPort,
name: sails.config.custom.smtpName,
secure: sails.config.custom.smtpSecure, secure: sails.config.custom.smtpSecure,
auth: sails.config.custom.smtpUser && { auth: sails.config.custom.smtpUser && {
user: sails.config.custom.smtpUser, user: sails.config.custom.smtpUser,
+1
View File
@@ -54,6 +54,7 @@ module.exports.custom = {
smtpHost: process.env.SMTP_HOST, smtpHost: process.env.SMTP_HOST,
smtpPort: process.env.SMTP_PORT || 587, smtpPort: process.env.SMTP_PORT || 587,
smtpName: process.env.SMTP_NAME,
smtpSecure: process.env.SMTP_SECURE === 'true', smtpSecure: process.env.SMTP_SECURE === 'true',
smtpUser: process.env.SMTP_USER, smtpUser: process.env.SMTP_USER,
smtpPassword: process.env.SMTP_PASSWORD, smtpPassword: process.env.SMTP_PASSWORD,