diff --git a/.ddev/addon-metadata/phpmyadmin/manifest.yaml b/.ddev/addon-metadata/phpmyadmin/manifest.yaml new file mode 100644 index 0000000..e86794d --- /dev/null +++ b/.ddev/addon-metadata/phpmyadmin/manifest.yaml @@ -0,0 +1,10 @@ +name: phpmyadmin +repository: ddev/ddev-phpmyadmin +version: v0.3.8 +install_date: "2024-08-29T14:51:22+02:00" +project_files: + - docker-compose.phpmyadmin.yaml + - docker-compose.phpmyadmin_norouter.yaml + - commands/host/phpmyadmin +global_files: [] +removal_actions: [] diff --git a/.ddev/commands/host/phpmyadmin b/.ddev/commands/host/phpmyadmin new file mode 100755 index 0000000..a1cdb80 --- /dev/null +++ b/.ddev/commands/host/phpmyadmin @@ -0,0 +1,14 @@ +#!/bin/bash + +## #ddev-generated: If you want to edit and own this file, remove this line. +## Description: Launch a browser with PhpMyAdmin +## Usage: phpmyadmin +## Example: "ddev phpmyadmin" + +DDEV_PHPMYADMIN_PORT=8036 +DDEV_PHPMYADMIN_HTTPS_PORT=8037 +if [ ${DDEV_PRIMARY_URL%://*} = "http" ] || [ -n "${GITPOD_WORKSPACE_ID:-}" ] || [ "${CODESPACES:-}" = "true" ]; then + ddev launch :$DDEV_PHPMYADMIN_PORT +else + ddev launch :$DDEV_PHPMYADMIN_HTTPS_PORT +fi diff --git a/.ddev/config.yaml b/.ddev/config.yaml new file mode 100644 index 0000000..bfb6364 --- /dev/null +++ b/.ddev/config.yaml @@ -0,0 +1,279 @@ +name: probuddy-master +type: php +docroot: /src/client +#docroot: /src/client/manager #manager console +#docroot: /src/client/app #app +php_version: "8.1" +webserver_type: nginx-fpm +xdebug_enabled: false +additional_hostnames: [] +additional_fqdns: [] +database: + type: mariadb + version: "10.4" +use_dns_when_possible: true +composer_version: "2" +web_environment: [] +router_http_port: 8091 +router_https_port: 8463 + +# Key features of DDEV's config.yaml: + +# name: # Name of the project, automatically provides +# http://projectname.ddev.site and https://projectname.ddev.site + +# type: # backdrop, craftcms, django4, drupal6/7/8/9/10, laravel, magento, magento2, php, python, shopware6, silverstripe, typo3, wordpress +# See https://ddev.readthedocs.io/en/latest/users/quickstart/ for more +# information on the different project types + +# docroot: # Relative path to the directory containing index.php. + +# php_version: "8.1" # PHP version to use, "5.6", "7.0", "7.1", "7.2", "7.3", "7.4", "8.0", "8.1", "8.2", "8.3" + +# You can explicitly specify the webimage but this +# is not recommended, as the images are often closely tied to DDEV's' behavior, +# so this can break upgrades. + +# webimage: # nginx/php docker image. + +# database: +# type: # mysql, mariadb, postgres +# version: # database version, like "10.4" or "8.0" +# MariaDB versions can be 5.5-10.8 and 10.11, MySQL versions can be 5.5-8.0 +# PostgreSQL versions can be 9-16. + +# router_http_port: # Port to be used for http (defaults to global configuration, usually 80) +# router_https_port: # Port for https (defaults to global configuration, usually 443) + +# xdebug_enabled: false # Set to true to enable Xdebug and "ddev start" or "ddev restart" +# Note that for most people the commands +# "ddev xdebug" to enable Xdebug and "ddev xdebug off" to disable it work better, +# as leaving Xdebug enabled all the time is a big performance hit. + +# xhprof_enabled: false # Set to true to enable Xhprof and "ddev start" or "ddev restart" +# Note that for most people the commands +# "ddev xhprof" to enable Xhprof and "ddev xhprof off" to disable it work better, +# as leaving Xhprof enabled all the time is a big performance hit. + +# webserver_type: nginx-fpm, apache-fpm, or nginx-gunicorn + +# timezone: Europe/Berlin +# This is the timezone used in the containers and by PHP; +# it can be set to any valid timezone, +# see https://en.wikipedia.org/wiki/List_of_tz_database_time_zones +# For example Europe/Dublin or MST7MDT + +# composer_root: +# Relative path to the Composer root directory from the project root. This is +# the directory which contains the composer.json and where all Composer related +# commands are executed. + +# composer_version: "2" +# You can set it to "" or "2" (default) for Composer v2 or "1" for Composer v1 +# to use the latest major version available at the time your container is built. +# It is also possible to use each other Composer version channel. This includes: +# - 2.2 (latest Composer LTS version) +# - stable +# - preview +# - snapshot +# Alternatively, an explicit Composer version may be specified, for example "2.2.18". +# To reinstall Composer after the image was built, run "ddev debug refresh". + +# nodejs_version: "18" +# change from the default system Node.js version to any other version. +# Numeric version numbers can be complete (i.e. 18.15.0) or +# incomplete (18, 17.2, 16). 'lts' and 'latest' can be used as well along with +# other named releases. +# see https://www.npmjs.com/package/n#specifying-nodejs-versions +# Note that you can continue using 'ddev nvm' or nvm inside the web container +# to change the project's installed node version if you need to. + +# additional_hostnames: +# - somename +# - someothername +# would provide http and https URLs for "somename.ddev.site" +# and "someothername.ddev.site". + +# additional_fqdns: +# - example.com +# - sub1.example.com +# would provide http and https URLs for "example.com" and "sub1.example.com" +# Please take care with this because it can cause great confusion. + +# upload_dirs: "custom/upload/dir" +# +# upload_dirs: +# - custom/upload/dir +# - ../private +# +# would set the destination paths for ddev import-files to /custom/upload/dir +# When Mutagen is enabled this path is bind-mounted so that all the files +# in the upload_dirs don't have to be synced into Mutagen. + +# disable_upload_dirs_warning: false +# If true, turns off the normal warning that says +# "You have Mutagen enabled and your 'php' project type doesn't have upload_dirs set" + +# ddev_version_constraint: "" +# Example: +# ddev_version_constraint: ">= 1.22.4" +# This will enforce that the running ddev version is within this constraint. +# See https://github.com/Masterminds/semver#checking-version-constraints for +# supported constraint formats + +# working_dir: +# web: /var/www/html +# db: /home +# would set the default working directory for the web and db services. +# These values specify the destination directory for ddev ssh and the +# directory in which commands passed into ddev exec are run. + +# omit_containers: [db, ddev-ssh-agent] +# Currently only these containers are supported. Some containers can also be +# omitted globally in the ~/.ddev/global_config.yaml. Note that if you omit +# the "db" container, several standard features of DDEV that access the +# database container will be unusable. In the global configuration it is also +# possible to omit ddev-router, but not here. + +# performance_mode: "global" +# DDEV offers performance optimization strategies to improve the filesystem +# performance depending on your host system. Should be configured globally. +# +# If set, will override the global config. Possible values are: +# - "global": uses the value from the global config. +# - "none": disables performance optimization for this project. +# - "mutagen": enables Mutagen for this project. +# - "nfs": enables NFS for this project. +# +# See https://ddev.readthedocs.io/en/latest/users/install/performance/#nfs +# See https://ddev.readthedocs.io/en/latest/users/install/performance/#mutagen + +# fail_on_hook_fail: False +# Decide whether 'ddev start' should be interrupted by a failing hook + +# host_https_port: "59002" +# The host port binding for https can be explicitly specified. It is +# dynamic unless otherwise specified. +# This is not used by most people, most people use the *router* instead +# of the localhost port. + +# host_webserver_port: "59001" +# The host port binding for the ddev-webserver can be explicitly specified. It is +# dynamic unless otherwise specified. +# This is not used by most people, most people use the *router* instead +# of the localhost port. + +# host_db_port: "59002" +# The host port binding for the ddev-dbserver can be explicitly specified. It is dynamic +# unless explicitly specified. + +# mailpit_http_port: "8025" +# mailpit_https_port: "8026" +# The Mailpit ports can be changed from the default 8025 and 8026 + +# host_mailpit_port: "8025" +# The mailpit port is not normally bound on the host at all, instead being routed +# through ddev-router, but it can be bound directly to localhost if specified here. + +# webimage_extra_packages: [php7.4-tidy, php-bcmath] +# Extra Debian packages that are needed in the webimage can be added here + +# dbimage_extra_packages: [telnet,netcat] +# Extra Debian packages that are needed in the dbimage can be added here + +# use_dns_when_possible: true +# If the host has internet access and the domain configured can +# successfully be looked up, DNS will be used for hostname resolution +# instead of editing /etc/hosts +# Defaults to true + +# project_tld: ddev.site +# The top-level domain used for project URLs +# The default "ddev.site" allows DNS lookup via a wildcard +# If you prefer you can change this to "ddev.local" to preserve +# pre-v1.9 behavior. + +# ngrok_args: --basic-auth username:pass1234 +# Provide extra flags to the "ngrok http" command, see +# https://ngrok.com/docs/ngrok-agent/config or run "ngrok http -h" + +# disable_settings_management: false +# If true, DDEV will not create CMS-specific settings files like +# Drupal's settings.php/settings.ddev.php or TYPO3's AdditionalConfiguration.php +# In this case the user must provide all such settings. + +# You can inject environment variables into the web container with: +# web_environment: +# - SOMEENV=somevalue +# - SOMEOTHERENV=someothervalue + +# no_project_mount: false +# (Experimental) If true, DDEV will not mount the project into the web container; +# the user is responsible for mounting it manually or via a script. +# This is to enable experimentation with alternate file mounting strategies. +# For advanced users only! + +# bind_all_interfaces: false +# If true, host ports will be bound on all network interfaces, +# not the localhost interface only. This means that ports +# will be available on the local network if the host firewall +# allows it. + +# default_container_timeout: 120 +# The default time that DDEV waits for all containers to become ready can be increased from +# the default 120. This helps in importing huge databases, for example. + +#web_extra_exposed_ports: +#- name: nodejs +# container_port: 3000 +# http_port: 2999 +# https_port: 3000 +#- name: something +# container_port: 4000 +# https_port: 4000 +# http_port: 3999 +# Allows a set of extra ports to be exposed via ddev-router +# Fill in all three fields even if you don’t intend to use the https_port! +# If you don’t add https_port, then it defaults to 0 and ddev-router will fail to start. +# +# The port behavior on the ddev-webserver must be arranged separately, for example +# using web_extra_daemons. +# For example, with a web app on port 3000 inside the container, this config would +# expose that web app on https://.ddev.site:9999 and http://.ddev.site:9998 +# web_extra_exposed_ports: +# - name: myapp +# container_port: 3000 +# http_port: 9998 +# https_port: 9999 + +#web_extra_daemons: +#- name: "http-1" +# command: "/var/www/html/node_modules/.bin/http-server -p 3000" +# directory: /var/www/html +#- name: "http-2" +# command: "/var/www/html/node_modules/.bin/http-server /var/www/html/sub -p 3000" +# directory: /var/www/html + +# override_config: false +# By default, config.*.yaml files are *merged* into the configuration +# But this means that some things can't be overridden +# For example, if you have 'use_dns_when_possible: true'' you can't override it with a merge +# and you can't erase existing hooks or all environment variables. +# However, with "override_config: true" in a particular config.*.yaml file, +# 'use_dns_when_possible: false' can override the existing values, and +# hooks: +# post-start: [] +# or +# web_environment: [] +# or +# additional_hostnames: [] +# can have their intended affect. 'override_config' affects only behavior of the +# config.*.yaml file it exists in. + +# Many DDEV commands can be extended to run tasks before or after the +# DDEV command is executed, for example "post-start", "post-import-db", +# "pre-composer", "post-composer" +# See https://ddev.readthedocs.io/en/stable/users/extend/custom-commands/ for more +# information on the commands that can be extended and the tasks you can define +# for them. Example: +#hooks: diff --git a/.ddev/docker-compose.phpmyadmin.yaml b/.ddev/docker-compose.phpmyadmin.yaml new file mode 100644 index 0000000..8d5dd2a --- /dev/null +++ b/.ddev/docker-compose.phpmyadmin.yaml @@ -0,0 +1,30 @@ +#ddev-generated +services: + phpmyadmin: + container_name: ddev-${DDEV_SITENAME}-phpmyadmin + image: phpmyadmin:5.2.0 + working_dir: "/root" + restart: "no" + labels: + com.ddev.site-name: ${DDEV_SITENAME} + com.ddev.approot: $DDEV_APPROOT + volumes: + - ".:/mnt/ddev_config" + - "ddev-global-cache:/mnt/ddev-global-cache" + expose: + - "80" + environment: + - PMA_USER=root + - PMA_PASSWORD=root + - PMA_HOST=db + - PMA_PORT=3306 + - VIRTUAL_HOST=$DDEV_HOSTNAME + - UPLOAD_LIMIT=4000M + - HTTP_EXPOSE=8036:80 + - HTTPS_EXPOSE=8037:80 + healthcheck: + interval: 120s + timeout: 2s + retries: 1 + depends_on: + - db diff --git a/.ddev/docker-compose.phpmyadmin_norouter.yaml b/.ddev/docker-compose.phpmyadmin_norouter.yaml new file mode 100644 index 0000000..f369b69 --- /dev/null +++ b/.ddev/docker-compose.phpmyadmin_norouter.yaml @@ -0,0 +1,4 @@ +#ddev-generated +# If omit_containers[ddev-router] then this file will be replaced +# with another with a `ports` statement to directly expose port 80 to 8036 +services: {} diff --git a/.ddev/php/xdebug.ini b/.ddev/php/xdebug.ini new file mode 100644 index 0000000..768107f --- /dev/null +++ b/.ddev/php/xdebug.ini @@ -0,0 +1,8 @@ +;xdebug.log = /home/danielknudsen/xdebug.log +;xdebug.client_port = 9003 +;xdebug.client_host=host.docker.internal +xdebug.client_host=docker.for.mac.localhost +xdebug.mode = debug +xdebug.start_with_request = yes +xdebug.log = /tmp/xdebug.log +xdebug.log_level = 7 \ No newline at end of file diff --git a/1-deployBetaProBuddy.sh b/1-deployBetaProBuddy.sh index 8621bc5..89cf04f 100644 --- a/1-deployBetaProBuddy.sh +++ b/1-deployBetaProBuddy.sh @@ -28,6 +28,9 @@ cp -rf /var/www/vhosts/spawntree.de/probuddy.spawntree.de/git_repositories/beta- rm -rf /var/www/vhosts/spawntree.de/probuddy.spawntree.de/httpdocs/src/server/dependencies cp -rf /var/www/vhosts/spawntree.de/probuddy.spawntree.de/git_repositories/beta-probuddy/src/server/dependencies /var/www/vhosts/spawntree.de/probuddy.spawntree.de/httpdocs/src/server +rm -rf /var/www/vhosts/spawntree.de/probuddy.spawntree.de/httpdocs/src/server/patches +cp -rf /var/www/vhosts/spawntree.de/probuddy.spawntree.de/git_repositories/beta-probuddy/src/server/patches /var/www/vhosts/spawntree.de/probuddy.spawntree.de/httpdocs/src/server + rm -rf /var/www/vhosts/spawntree.de/probuddy.spawntree.de/httpdocs/src/server/server/cli cp -rf /var/www/vhosts/spawntree.de/probuddy.spawntree.de/git_repositories/beta-probuddy/src/server/server/cli /var/www/vhosts/spawntree.de/probuddy.spawntree.de/httpdocs/src/server/server diff --git a/1-deployLiveProBuddy.sh b/1-deployLiveProBuddy.sh new file mode 100644 index 0000000..dc4cdf5 --- /dev/null +++ b/1-deployLiveProBuddy.sh @@ -0,0 +1,55 @@ +#!/bin/bash + +cd /www/htdocs/v034011/projects/probuddy/git_repository/probuddy-master +git pull + +echo "$(tput setab 2)pro-buddy has been PULLED$(tput sgr 0)" + +rm -rf /www/htdocs/v034011/projects/probuddy/client +cp -rf /www/htdocs/v034011/projects/probuddy/git_repository/probuddy-master/src/client /www/htdocs/v034011/projects/probuddy + +rm -rf /www/htdocs/v034011/projects/probuddy/server/admin/AHDMN +cp -rf /www/htdocs/v034011/projects/probuddy/git_repository/probuddy-master/src/server/admin/AHDMN /www/htdocs/v034011/projects/probuddy/server/admin + +rm -rf /www/htdocs/v034011/projects/probuddy/server/admin/libs +cp -rf /www/htdocs/v034011/projects/probuddy/git_repository/probuddy-master/src/server/admin/libs /www/htdocs/v034011/projects/probuddy/server/admin + +rm -rf /www/htdocs/v034011/projects/probuddy/server/admin/services +cp -rf /www/htdocs/v034011/projects/probuddy/git_repository/probuddy-master/src/server/admin/services /www/htdocs/v034011/projects/probuddy/server/admin + +rm -rf /www/htdocs/v034011/projects/probuddy/server/admin/boot.php +cp -rf /www/htdocs/v034011/projects/probuddy/git_repository/probuddy-master/src/server/admin/boot.php /www/htdocs/v034011/projects/probuddy/server/admin + +rm -rf /www/htdocs/v034011/projects/probuddy/server/dependencies +cp -rf /www/htdocs/v034011/projects/probuddy/git_repository/probuddy-master/src/server/dependencies /www/htdocs/v034011/projects/probuddy/server + +rm -rf /www/htdocs/v034011/projects/probuddy/server/patches +cp -rf /www/htdocs/v034011/projects/probuddy/git_repository/probuddy-master/src/server/patches /www/htdocs/v034011/projects/probuddy/server + +rm -rf /www/htdocs/v034011/projects/probuddy/server/server/cli +cp -rf /www/htdocs/v034011/projects/probuddy/git_repository/probuddy-master/src/server/server/cli /www/htdocs/v034011/projects/probuddy/server/server + +rm -rf /www/htdocs/v034011/projects/probuddy/server/server/control +cp -rf /www/htdocs/v034011/projects/probuddy/git_repository/probuddy-master/src/server/server/control /www/htdocs/v034011/projects/probuddy/server/server + +rm -rf /www/htdocs/v034011/projects/probuddy/server/server/core +cp -rf /www/htdocs/v034011/projects/probuddy/git_repository/probuddy-master/src/server/server/core /www/htdocs/v034011/projects/probuddy/server/server + +rm -rf /www/htdocs/v034011/projects/probuddy/server/server/job +cp -rf /www/htdocs/v034011/projects/probuddy/git_repository/probuddy-master/src/server/server/job /www/htdocs/v034011/projects/probuddy/server/server + +rm -rf /www/htdocs/v034011/projects/probuddy/server/server/template +cp -rf /www/htdocs/v034011/projects/probuddy/git_repository/probuddy-master/src/server/server/template /www/htdocs/v034011/projects/probuddy/server/server + +rm -rf /www/htdocs/v034011/projects/probuddy/server/server/utils +cp -rf /www/htdocs/v034011/projects/probuddy/git_repository/probuddy-master/src/server/server/utils /www/htdocs/v034011/projects/probuddy/server/server + +rm -rf /www/htdocs/v034011/projects/probuddy/server/shared +cp -rf /www/htdocs/v034011/projects/probuddy/git_repository/probuddy-master/src/server/shared /www/htdocs/v034011/projects/probuddy/server + +echo "$(tput setab 2)Files have been copied$(tput sgr 0)" + + +echo "$(tput setab 7)$(tput setaf 1)THINK ABOUT POSSIBLE PATCHES!" + +echo "You have updated probuddy live!$(tput sgr 0)" diff --git a/tools/patches/1addActiveStateToProfile.php b/1addActiveStateToProfile.php similarity index 100% rename from tools/patches/1addActiveStateToProfile.php rename to 1addActiveStateToProfile.php diff --git a/README.md b/README.md index a2c30ea..bb7301c 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,8 @@ +DDEV +- Um zwischen app und manager zu wechseln in die .ddev/config.yaml gucken, dort dann entsprechend einstellen :) + + +DOCKER - Client: http://localhost:8097/client/app/#/auth/start - Database: http://localhost:8096 - Template-Engine: https://github.com/cho45/micro-template.js @@ -28,3 +33,5 @@ Neuinstallation: - php pw_gen.php - Erzeugt Passwort "test" - In phpmyadmin pb_core - account: SQL Statement: UPDATE `account` SET `pass`='aa47377bfef0917b6ff2e73ece5a6952d7763664' WHERE 1 +Update client: +- um Client Caching zu umgehen bei Frontend Changes -> versions nummer erhöhen in src/client/app/index.php \ No newline at end of file diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..4aced6d --- /dev/null +++ b/composer.json @@ -0,0 +1,5 @@ +{ + "require": { + "ramsey/uuid": "^4.7" + } +} diff --git a/composer.lock b/composer.lock new file mode 100644 index 0000000..70e321a --- /dev/null +++ b/composer.lock @@ -0,0 +1,260 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "311c7a785a2af4ab4dae0f24542d289d", + "packages": [ + { + "name": "brick/math", + "version": "0.12.1", + "source": { + "type": "git", + "url": "https://github.com/brick/math.git", + "reference": "f510c0a40911935b77b86859eb5223d58d660df1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/brick/math/zipball/f510c0a40911935b77b86859eb5223d58d660df1", + "reference": "f510c0a40911935b77b86859eb5223d58d660df1", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.2", + "phpunit/phpunit": "^10.1", + "vimeo/psalm": "5.16.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Brick\\Math\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Arbitrary-precision arithmetic library", + "keywords": [ + "Arbitrary-precision", + "BigInteger", + "BigRational", + "arithmetic", + "bigdecimal", + "bignum", + "bignumber", + "brick", + "decimal", + "integer", + "math", + "mathematics", + "rational" + ], + "support": { + "issues": "https://github.com/brick/math/issues", + "source": "https://github.com/brick/math/tree/0.12.1" + }, + "funding": [ + { + "url": "https://github.com/BenMorel", + "type": "github" + } + ], + "time": "2023-11-29T23:19:16+00:00" + }, + { + "name": "ramsey/collection", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/ramsey/collection.git", + "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/collection/zipball/a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5", + "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "captainhook/plugin-composer": "^5.3", + "ergebnis/composer-normalize": "^2.28.3", + "fakerphp/faker": "^1.21", + "hamcrest/hamcrest-php": "^2.0", + "jangregor/phpstan-prophecy": "^1.0", + "mockery/mockery": "^1.5", + "php-parallel-lint/php-console-highlighter": "^1.0", + "php-parallel-lint/php-parallel-lint": "^1.3", + "phpcsstandards/phpcsutils": "^1.0.0-rc1", + "phpspec/prophecy-phpunit": "^2.0", + "phpstan/extension-installer": "^1.2", + "phpstan/phpstan": "^1.9", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-phpunit": "^1.3", + "phpunit/phpunit": "^9.5", + "psalm/plugin-mockery": "^1.1", + "psalm/plugin-phpunit": "^0.18.4", + "ramsey/coding-standard": "^2.0.3", + "ramsey/conventional-commits": "^1.3", + "vimeo/psalm": "^5.4" + }, + "type": "library", + "extra": { + "captainhook": { + "force-install": true + }, + "ramsey/conventional-commits": { + "configFile": "conventional-commits.json" + } + }, + "autoload": { + "psr-4": { + "Ramsey\\Collection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ben Ramsey", + "email": "ben@benramsey.com", + "homepage": "https://benramsey.com" + } + ], + "description": "A PHP library for representing and manipulating collections.", + "keywords": [ + "array", + "collection", + "hash", + "map", + "queue", + "set" + ], + "support": { + "issues": "https://github.com/ramsey/collection/issues", + "source": "https://github.com/ramsey/collection/tree/2.0.0" + }, + "funding": [ + { + "url": "https://github.com/ramsey", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ramsey/collection", + "type": "tidelift" + } + ], + "time": "2022-12-31T21:50:55+00:00" + }, + { + "name": "ramsey/uuid", + "version": "4.7.6", + "source": { + "type": "git", + "url": "https://github.com/ramsey/uuid.git", + "reference": "91039bc1faa45ba123c4328958e620d382ec7088" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/91039bc1faa45ba123c4328958e620d382ec7088", + "reference": "91039bc1faa45ba123c4328958e620d382ec7088", + "shasum": "" + }, + "require": { + "brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11 || ^0.12", + "ext-json": "*", + "php": "^8.0", + "ramsey/collection": "^1.2 || ^2.0" + }, + "replace": { + "rhumsaa/uuid": "self.version" + }, + "require-dev": { + "captainhook/captainhook": "^5.10", + "captainhook/plugin-composer": "^5.3", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", + "doctrine/annotations": "^1.8", + "ergebnis/composer-normalize": "^2.15", + "mockery/mockery": "^1.3", + "paragonie/random-lib": "^2", + "php-mock/php-mock": "^2.2", + "php-mock/php-mock-mockery": "^1.3", + "php-parallel-lint/php-parallel-lint": "^1.1", + "phpbench/phpbench": "^1.0", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-phpunit": "^1.1", + "phpunit/phpunit": "^8.5 || ^9", + "ramsey/composer-repl": "^1.4", + "slevomat/coding-standard": "^8.4", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.9" + }, + "suggest": { + "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.", + "ext-gmp": "Enables faster math with arbitrary-precision integers using GMP.", + "ext-uuid": "Enables the use of PeclUuidTimeGenerator and PeclUuidRandomGenerator.", + "paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter", + "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type." + }, + "type": "library", + "extra": { + "captainhook": { + "force-install": true + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Ramsey\\Uuid\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A PHP library for generating and working with universally unique identifiers (UUIDs).", + "keywords": [ + "guid", + "identifier", + "uuid" + ], + "support": { + "issues": "https://github.com/ramsey/uuid/issues", + "source": "https://github.com/ramsey/uuid/tree/4.7.6" + }, + "funding": [ + { + "url": "https://github.com/ramsey", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ramsey/uuid", + "type": "tidelift" + } + ], + "time": "2024-04-27T21:32:50+00:00" + } + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": [], + "platform-dev": [], + "plugin-api-version": "2.6.0" +} diff --git a/src/client/app/css/app.css b/src/client/app/css/app.css index c925fe5..dbabb8d 100644 --- a/src/client/app/css/app.css +++ b/src/client/app/css/app.css @@ -81,7 +81,13 @@ body.body-content { } .content { - margin-top: 72px; + /*margin-top: 72px;*/ + margin-top: 20px; + margin-bottom: 20px; +} +.dropdown-menu { + top: auto; + bottom: 100%; } .c-offcanvas--right { @@ -92,6 +98,8 @@ body.body-content { { position: absolute; min-width: 280px; + max-height: calc(100vh - 60px); + overflow: auto; } .ul-offcanvas-nav @@ -457,7 +465,8 @@ body.body-auth .action-button { position: fixed; -webkit-transform: translate3d(0,0,0); transform: translate3d(0,0,0); - bottom: 20px; + /*bottom: 20px;*/ + bottom: 76px; right: 20px; text-align: center; font-size: 20px; @@ -471,6 +480,8 @@ body.body-auth .action-button { overflow: hidden; z-index: 100; box-shadow: 0 2px 5px 0 rgba(0,0,0,0.16), 0 2px 10px 0 rgba(0,0,0,0.12); + overflow: auto; + max-height: calc(100% - 85px); } .action-list { @@ -482,7 +493,7 @@ body.body-auth .action-button { bottom: 0; right: 0; opacity: 0; - background-color: white; + background-color: #fff; } .action-list-item { @@ -1125,6 +1136,44 @@ h6.in-card { font-size: 0.75rem; } +.search-box { + display: flex; + position: relative; + margin-right: 20px; +} + +.search-box .fa { + font-size: 16px; + color: #ccc; + position: absolute; + right: 8px; + top: 50%; + transform: translate(0,-50%); + +} + +.search-box input { + width: 200px; + padding-right: 25px; +} + +.right-content { + display: flex; + justify-content: right; + align-items: center; +} + +@media only screen and (max-width: 500px) { + .float-right.search-content { + float: none !important; + margin-right: 0 !important; + } + .right-content { + justify-content: left; + padding-top: 5px; + } +} + h6.calendar-week { margin-top: 0; margin-bottom: 0; diff --git a/src/client/app/index.php b/src/client/app/index.php index d57d9c6..5f0c1da 100644 --- a/src/client/app/index.php +++ b/src/client/app/index.php @@ -1,8 +1,7 @@ diff --git a/src/client/app/js/app/core/Dict.js b/src/client/app/js/app/core/Dict.js index ea3c7fb..bf75dee 100644 --- a/src/client/app/js/app/core/Dict.js +++ b/src/client/app/js/app/core/Dict.js @@ -111,6 +111,7 @@ app.core.Dict = { "CLOSE" : "Schließen", "CREATE_APPOINTMENT" : "Termin erstellen", "APPOINTMENT_SUBJECT" : "Terminname", + "APPOINTMENT_ICON" : "Icon", "APPOINTMENT_START_DATE" : "Startdatum", "APPOINTMENT_START_TIME" : "Startzeit", "APPOINTMENT_END_DATE" : "Enddatum", @@ -431,6 +432,8 @@ app.core.Dict = { "ACCOUNT_NOT_VALIDATED_DESCRIPTION" : "Bitte validiere zunächst deine Email Adresse. Wir haben dir gerade einen Validierungslink per Mail zugeschickt. Bitte schau in deinem Postfach nach (ggf. auch im Spam-Ordner) und klicke auf den Button.", "LOGIN_FIRSTNAME" : "Vorname", "LOGIN_LASTNAME" : "Nachname", + "DELETION_NOT_POSSIBLE_INFO_HEADLINE" : "Informationen zur Löschung deines Profils", + "DELETION_NOT_POSSIBLE_INFO" : "Du hast noch {0} Teilnahme(n) für zukünftige Termine, bei denen die Absagefrist noch nicht verstrichen ist. Bitte sage alle Teilnahmen ab, bevor Du Deinen Account löschen kannst.", "DELETION_GROUP_OWNER_INFO_HEADLINE" : "Informationen zur Löschung deines Profils", "DELETION_GROUP_OWNER_INFO" : "Bitte schreibe eine Mail an support@probuddy.de um die Löschung deines Profile bei Probuddy zu veranlassen. Da du Gruppeninhaber mindestens einer Gruppe bei ProBuddy bist, wird diese Gruppe/Gruppen automatisch mitgelöscht.", "BTN_BACK" : "Zurück", @@ -571,6 +574,7 @@ app.core.Dict = { "GROUP_MANAGEMENT_MEMBERS_ACTIVE" : "Aktiv", "GROUP_MANAGEMENT_MEMBERS_INACTIVE" : "Inaktiv", "GROUP_MANAGEMENT_MEMBERS_NOT_APPROVED" : "Unbestätigt", + "GROUP_MANAGEMENT_MEMBERS_DELETED" : "Gelöscht", "GROUP_MANAGEMENT_MEMBERS_CHANGE_STATUS" : "Gruppenstatus ändern", "GROUP_MANAGEMENT_MEMBERS_CHANGE_STATUS_INFO" : "Du kannst deinen eigenen Gruppenstatus nicht verändern.", "BTN_GROUP_MANAGEMENT_MEMBERS_SAVE_STATUS" : "Status speichern", diff --git a/src/client/app/js/app/model/Appointment.js b/src/client/app/js/app/model/Appointment.js index 35dbc1c..c783cb0 100644 --- a/src/client/app/js/app/model/Appointment.js +++ b/src/client/app/js/app/model/Appointment.js @@ -15,6 +15,7 @@ app.model.Appointment = function( appData, attendees, attendeeProfiles ) attendees = attendees || [], attendeeProfiles = attendeeProfiles || [], id = data.id, + icon = data.icon, category = data.category || null, categoryIds = typeof( data.category_ids_js ) === 'string' ? JSON.parse( data.category_ids_js ) : data.category_ids_js, visibility = data.visibility, @@ -65,6 +66,11 @@ app.model.Appointment = function( appData, attendees, attendeeProfiles ) return teamId; }; + this.getIcon = function() + { + return icon; + }; + this.getSubject = function() { return subject; diff --git a/src/client/app/js/app/model/Profile.js b/src/client/app/js/app/model/Profile.js index b661815..8311827 100644 --- a/src/client/app/js/app/model/Profile.js +++ b/src/client/app/js/app/model/Profile.js @@ -223,6 +223,11 @@ app.model.Profile = function( data, groupsData ) teamData = gd; }; + this.getGroupStatus = function( groupId ) + { + return this.getGroupData(groupId).status; + } + this.isOwn = function() { return ( this.getId() == app.model.SessionUser.getUserProfile().getId() ); diff --git a/src/client/app/js/app/state/AppointmentCreate.js b/src/client/app/js/app/state/AppointmentCreate.js index e783631..60c6b2e 100644 --- a/src/client/app/js/app/state/AppointmentCreate.js +++ b/src/client/app/js/app/state/AppointmentCreate.js @@ -184,6 +184,7 @@ app.state.AppointmentCreate = function() var $form = $content.find( '[data-id="form-appointment"]' ).first(), teamId, + icon, appointmentState = $form.find( '[data-id="checkbox-appointment-state"]' ).first().is( ':checked' ) ? 'open' : null, isValid = app.util.Form.bootstrapValidate( $form ); @@ -191,11 +192,15 @@ app.state.AppointmentCreate = function() { app.gui.PageLoader.show(); teamId = $form.find( '[data-id="select-team-id"]' ).first().val(); + icon = $('#input-subject-icon option:selected').val(); + + //console.log(icon); app.core.Rpc.call( 'Appointment', 'create', { teamId : teamId, + icon: icon, categoryIds : $form.find( '[data-id="select-category-' + teamId + '"]' ).first().val(), visibility : ( 'visibility-category-only' === $form.find( '[name="input-visibility"]:checked' ).first().val() ) ? app.model.Appointment.ENUM_VISIBLE_FOR_CATEGORIES : app.model.Appointment.ENUM_VISIBLE_FOR_ALL, subject : $form.find( '[data-id="input-subject"]' ).first().val(), diff --git a/src/client/app/js/app/state/AppointmentEdit.js b/src/client/app/js/app/state/AppointmentEdit.js index d01b60d..ced913a 100644 --- a/src/client/app/js/app/state/AppointmentEdit.js +++ b/src/client/app/js/app/state/AppointmentEdit.js @@ -168,6 +168,7 @@ app.state.AppointmentEdit= function() 'Appointment', 'update', { + icon: $('#input-subject-icon option:selected').val(), processSerial : isSerial, appointmentId : appointmentId, categoryIds : $form.find( '[data-id="select-category-' + appointment.getTeamId() + '"]' ).first().val(), diff --git a/src/client/app/js/app/state/AppointmentEditAttendee.js b/src/client/app/js/app/state/AppointmentEditAttendee.js index b2eb3ab..35c485e 100644 --- a/src/client/app/js/app/state/AppointmentEditAttendee.js +++ b/src/client/app/js/app/state/AppointmentEditAttendee.js @@ -31,7 +31,7 @@ app.state.AppointmentEditAttendee = function() app.core.Rpc.call( 'Team', 'getMembers', - { teamId : appointment.getTeamId() }, + { teamId : appointment.getTeamId(), activeOnly: true }, function( res2 ) { let childs, m, notDecided = []; diff --git a/src/client/app/js/app/state/ConfigurationAttendanceLog.js b/src/client/app/js/app/state/ConfigurationAttendanceLog.js index c336ed1..068ddb6 100644 --- a/src/client/app/js/app/state/ConfigurationAttendanceLog.js +++ b/src/client/app/js/app/state/ConfigurationAttendanceLog.js @@ -40,7 +40,7 @@ app.state.ConfigurationAttendanceLog = function() { $content.find( '[data-id="container-appointment-log"]' ).first().html( app.core.View.getTemplate( - 'group-member-management-body-appointment-log', + 'group-member-management-member-body-appointment-log', { logs : res.appointmentLog } diff --git a/src/client/app/js/app/state/ConfigurationProfileDelete.js b/src/client/app/js/app/state/ConfigurationProfileDelete.js index 7fc914a..a03e36b 100644 --- a/src/client/app/js/app/state/ConfigurationProfileDelete.js +++ b/src/client/app/js/app/state/ConfigurationProfileDelete.js @@ -18,15 +18,18 @@ app.state.ConfigurationProfileDelete = function() app.core.Rpc.call( 'Account', 'getAccountRelatedData', - null, + { + includeNumFutureAttendances : true + }, function( res ) { app.gui.PageLoader.hide(); - +console.log(res); app.core.View.setContent( app.core.View.getTemplate( 'configuration-profile-delete', { - profile: new app.model.Profile(res.profile) + profile: new app.model.Profile(res.profile), + numFutureAttendances: res.numFutureAttendances } ) ); diff --git a/src/client/app/js/app/state/CourseCategories.js b/src/client/app/js/app/state/CourseCategories.js index 3f2de62..ad457e5 100644 --- a/src/client/app/js/app/state/CourseCategories.js +++ b/src/client/app/js/app/state/CourseCategories.js @@ -30,7 +30,9 @@ app.state.CourseCategories = function() 'Team', 'getDetails', { - teamId : groupId + teamId : groupId, + includeMembers: true, + activeOnly: true }, function( res ) { diff --git a/src/client/app/js/app/state/GroupMemberManagement.js b/src/client/app/js/app/state/GroupMemberManagement.js index 2931f57..05c3e6f 100644 --- a/src/client/app/js/app/state/GroupMemberManagement.js +++ b/src/client/app/js/app/state/GroupMemberManagement.js @@ -13,11 +13,13 @@ app.state.GroupMemberManagement = function() { let $content = app.core.View.getContent(), group = null, + currentProfile = null, memberToEdit = null, members = [], membersActive = [], membersInactive = [], membersNotApproved = [], + membersDeleted = [], groupId = p.groupId, memberId = p.hasOwnProperty( 'memberId' ) ? p.memberId : null, activeTab = 'active'; @@ -65,6 +67,10 @@ app.state.GroupMemberManagement = function() case 'not_approved': membersNotApproved.push(member); break; + case 'deleted': + membersDeleted.push(member); + console.log(member.isAccessible()) + break; } } @@ -76,6 +82,7 @@ app.state.GroupMemberManagement = function() membersActive: membersActive, membersInactive: membersInactive, membersNotApproved: membersNotApproved, + membersDeleted: membersDeleted, group : group, groups : app.model.SessionUser.getAdminGroups(), currentProfile : currentProfile, diff --git a/src/client/app/js/app/state/GroupMemberManagementMember.js b/src/client/app/js/app/state/GroupMemberManagementMember.js index abc130e..459a743 100644 --- a/src/client/app/js/app/state/GroupMemberManagementMember.js +++ b/src/client/app/js/app/state/GroupMemberManagementMember.js @@ -11,7 +11,6 @@ app.state.GroupMemberManagementMember = function() state.onEnter = function( p ) { - console.log(p); let $content = app.core.View.getContent(), fnRenderMemberForm = null, fnGetMemberById = null, @@ -27,6 +26,11 @@ app.state.GroupMemberManagementMember = function() fnRenderMemberForm = function( profile ) { + let status = ''; + if (profile) { + status = profile.getGroupData(groupId).status; + } + $memberContainer = $content.find( '[data-id="member-container"]' ).first(); $memberContainer.html( app.core.View.getTemplate( @@ -34,6 +38,7 @@ app.state.GroupMemberManagementMember = function() { p : profile, g : group, + status: status } ) ); diff --git a/src/client/app/js/app/state/Home.js b/src/client/app/js/app/state/Home.js index 898931b..a1c58fd 100644 --- a/src/client/app/js/app/state/Home.js +++ b/src/client/app/js/app/state/Home.js @@ -452,34 +452,6 @@ app.state.Home = function() } } - /** - * Render appointments according to pager setting - * @param pageNo - */ - function updatePaging( pageNo ) - { - var pager = self.createPager( - appointments, - +pageNo - ), - $content = app.core.View.getContent(); - - $content.html( - app.core.View.getTemplate( - 'home', - { - appointments : pager.pageElements, - pager : pager, - filter : filter, - groupsNotActiveString: groupsNotActiveString, - } - ) - ); - - // Animate scroll to top - $("html, body").animate({ scrollTop: 0 }); - } - // Note // This needs to be called once at the beginning to trigger correct handlers and body classes app.core.View.setContent( 'Loading...' ); @@ -511,14 +483,45 @@ app.state.Home = function() ) ); } - self.appointments = appointments; - updatePaging(); + $content = app.core.View.getContent(); + + $content.html( + app.core.View.getTemplate( + 'home', + { + appointments: appointments, + filter : filter, + groupsNotActiveString: groupsNotActiveString, + } + ) + ); + + // Animate scroll to top + $("html, body").animate({ scrollTop: 0 }); - $content.on( 'change', '[data-id="pager"]', function( e ) + $content.on('input', '[data-id="appointment-search-filter"]', function(e) { - updatePaging( +$( this ).val() ); + var searchTerm = $(this).val().toLowerCase(); + + // Filter elements + $('[data-type="appointment-item-container"]').each(function() { + + var $div = $(this); + let appCat = $div.find('.appointment-category').text().toLowerCase(); + let appSub = $div.find('.appointment-subject').text().toLowerCase(); + let appDate = $div.find('.appointment-datetime').text().toLowerCase(); + + if (appCat.includes(searchTerm) || + appSub.includes(searchTerm) || + appDate.includes(searchTerm) || + searchTerm === '') { + $div.show(); + } else { + $div.hide(); + } + }); }); $content.on( 'click', '[data-type="appointment-short-info"]', function( e ) diff --git a/src/client/app/js/app/state/StatsExport.js b/src/client/app/js/app/state/StatsExport.js index 28a2e57..fd2e881 100644 --- a/src/client/app/js/app/state/StatsExport.js +++ b/src/client/app/js/app/state/StatsExport.js @@ -104,7 +104,8 @@ app.state.StatsExport = function() 'Team', 'getDetails', { - teamId : groupId + teamId : groupId, + includeMembers: true }, function( res2 ) { diff --git a/src/client/app/tmpl/appointment-detail.html b/src/client/app/tmpl/appointment-detail.html index d35a27d..760cab8 100644 --- a/src/client/app/tmpl/appointment-detail.html +++ b/src/client/app/tmpl/appointment-detail.html @@ -44,7 +44,7 @@ <% } %>
- <%= a.getSubject() %> + <%= a.getIcon() %> <%= a.getSubject() %>
diff --git a/src/client/app/tmpl/appointment-form-edit.html b/src/client/app/tmpl/appointment-form-edit.html index 114d836..64669bc 100644 --- a/src/client/app/tmpl/appointment-form-edit.html +++ b/src/client/app/tmpl/appointment-form-edit.html @@ -24,22 +24,46 @@ value="<%= mTeam.getId() %>" />
- - -
- <%= _lc( 'VALIDATION_INPUT_REQUIRED' ) %> +
+
+ + +
+
+ + +
+ <%= _lc( 'VALIDATION_INPUT_REQUIRED' ) %> +
+
+
<% var categories = mTeam.getAdminCourseCategoriesForProfile( currentProfile ); %> diff --git a/src/client/app/tmpl/appointment-form.html b/src/client/app/tmpl/appointment-form.html index 9988f99..bc20a2a 100644 --- a/src/client/app/tmpl/appointment-form.html +++ b/src/client/app/tmpl/appointment-form.html @@ -38,20 +38,44 @@
- - -
- <%= _lc( 'VALIDATION_INPUT_REQUIRED' ) %> +
+
+ + +
+
+ + +
+ <%= _lc( 'VALIDATION_INPUT_REQUIRED' ) %> +
+
diff --git a/src/client/app/tmpl/configuration-profile-delete.html b/src/client/app/tmpl/configuration-profile-delete.html index c6f2152..cdc1dbb 100644 --- a/src/client/app/tmpl/configuration-profile-delete.html +++ b/src/client/app/tmpl/configuration-profile-delete.html @@ -19,6 +19,23 @@
+ <% } else if (numFutureAttendances > 0) { %> + +
+ <%= _lc( 'DELETION_NOT_POSSIBLE_INFO_HEADLINE' ) %> +
+
+

+ <%=raw _lc( 'DELETION_NOT_POSSIBLE_INFO', [numFutureAttendances] ) %> +

+
+ + <% } else { %>
-<% var currentUser = app.model.SessionUser.getUserProfile(); %> -
-
- -
-
-
-
-
- <%=raw p.getName() %> -
- <% if ( p.isInGroupCategory( 'DOGSCHOOL' ) ) { %> -
- <%= _lc( 'PROFILE_DOGNAME' ) %> -
-
- <%= p.getCustomGroupProperty( 'DOGSCHOOL', 'dogname' ) ? p.getCustomGroupProperty( 'DOGSCHOOL', 'dogname' ) : '---' %> -
- <% } %> -
- <%= _lc( 'PROFILE_STATUS' ) %> -
-
- <%= p.getStatus() %> + <% var currentUser = app.model.SessionUser.getUserProfile(); %> +
+
+
-
- <%= _lc( 'ADDRESS' ) %> -
-
- <%= p.getStreet() ? p.getStreet() : '---' %>
- - <%= p.getZipCode() ? p.getZipCode() : '' %> <%= p.getCity() ? p.getCity() : '' %> -
-
- <%= _lc( 'PHONE' ) %> -
-
- <% if ( p.getMobile() ) { %> - <%= p.getMobile() %> - <% } else { %> - --- - <% } %> -
- <% if ( p.getPhone() ) { %> - <%= p.getPhone() %> - <% } else { %> - --- +
+
+
+
+ <%=raw p.getName() %> +
+ <% if ( p.isInGroupCategory( 'DOGSCHOOL' ) ) { %> +
+ <%= _lc( 'PROFILE_DOGNAME' ) %> +
+
+ <%= p.getCustomGroupProperty( 'DOGSCHOOL', 'dogname' ) ? p.getCustomGroupProperty( 'DOGSCHOOL', 'dogname' ) : '---' %> +
<% } %> -
-
- <%= _lc( 'EMAIL' ) %> -
-
- <% if ( p.getEmail() ) { %> - <%= p.getEmail() %> - <% if ( p.getEmailValidated() === true ) { %> -
( <%= _lc( 'GROUP_MANAGEMENT_MEMBERS_EMAIL_VALIDATED' ) %> )
+
+ <%= _lc( 'PROFILE_STATUS' ) %> +
+
+ <%= p.getStatus() %> +
+
+ <%= _lc( 'ADDRESS' ) %> +
+
+ <%= p.getStreet() ? p.getStreet() : '---' %>
+ + <%= p.getZipCode() ? p.getZipCode() : '' %> <%= p.getCity() ? p.getCity() : '' %> +
+
+ <%= _lc( 'PHONE' ) %> +
+
+ <% if ( p.getMobile() ) { %> + <%= p.getMobile() %> + <% } else { %> + --- + <% } %> +
+ <% if ( p.getPhone() ) { %> + <%= p.getPhone() %> + <% } else { %> + --- + <% } %> +
+
+ <%= _lc( 'EMAIL' ) %> +
+
+ <% if ( p.getEmail() ) { %> + <%= p.getEmail() %> + <% if ( p.getEmailValidated() === true ) { %> +
( <%= _lc( 'GROUP_MANAGEMENT_MEMBERS_EMAIL_VALIDATED' ) %> )
+ <% } else { %> +
( <%= _lc( 'GROUP_MANAGEMENT_MEMBERS_EMAIL_NOT_VALIDATED' ) %> )
+ <% } %> <% } else { %> -
( <%= _lc( 'GROUP_MANAGEMENT_MEMBERS_EMAIL_NOT_VALIDATED' ) %> )
+ --- <% } %> - <% } else { %> - --- - <% } %> -
-
- <%= _lc( 'BIRTHDAY' ) %> -
-
- <%= ( null != p.getMomentBirthday() ) ? p.getMomentBirthday().format( 'DD.MM.YYYY' ) : '---' %> -
-
- <%= _lc( 'JOIN_DT' ) %> -
-
- <% var momentJoin = p.getMomentJoinInGroup( g.getId() ); %> - <%= ( null != momentJoin ) ? momentJoin.format( 'DD.MM.YYYY' ) : '---' %> +
+
+ <%= _lc( 'BIRTHDAY' ) %> +
+
+ <%= ( null != p.getMomentBirthday() ) ? p.getMomentBirthday().format( 'DD.MM.YYYY' ) : '---' %> +
+
+ <%= _lc( 'JOIN_DT' ) %> +
+
+ <% var momentJoin = p.getMomentJoinInGroup( g.getId() ); %> + <%= ( null != momentJoin ) ? momentJoin.format( 'DD.MM.YYYY' ) : '---' %> +
-
-
-
-
- <%= _lc( 'CHANGE_ROLE' ) %> -
-
-
-
- -
-
- -
- <% if ( 'trainer' === p.getRoleInGroup( g.getId() ) ) { %> -
- <%= _lc( 'CANNOT_CHANGE_GROUP_OWNER_ROLE_INFO' ) %> -
- <% } %> -
-
-
-
- <%= _lc( 'GROUP_MANAGEMENT_MEMBERS_CHANGE_STATUS' ) %> -
-
-
-
- -
-
- -
- <% if ( p.getId() === currentUser.getId() ) { %> -
- <%= _lc( 'GROUP_MANAGEMENT_MEMBERS_CHANGE_STATUS_INFO' ) %> -
- <% } %> -
-
-
-
- <%= _lc( 'ASSIGNED_MEMBER_GROUP_CATEGORIES' ) %> -
-
-
-
- <% var cgs = g.getCourseCategoriesForProfile( p ); %> - <% for ( var cgsi = 0; cgsi < cgs.length; cgsi++ ) { %> - <% if ( cgsi > 0 ) { %> - <%= ' ' %> - <% } %> - <%= cgs[ cgsi ].name %> +
+ <% if ( status !== 'deleted' ) { %> +
+
+ <%= _lc( 'CHANGE_ROLE' ) %> +
+
+
+
+ +
+
+ +
+ <% if ( 'trainer' === p.getRoleInGroup( g.getId() ) ) { %> +
+ <%= _lc( 'CANNOT_CHANGE_GROUP_OWNER_ROLE_INFO' ) %> +
+ <% } %> +
+
+
+
+ <%= _lc( 'GROUP_MANAGEMENT_MEMBERS_CHANGE_STATUS' ) %> +
+
+
+
+ +
+
+ +
+ <% if ( p.getId() === currentUser.getId() ) { %> +
+ <%= _lc( 'GROUP_MANAGEMENT_MEMBERS_CHANGE_STATUS_INFO' ) %> +
+ <% } %> +
+
+
+
+ <%= _lc( 'ASSIGNED_MEMBER_GROUP_CATEGORIES' ) %> +
+
+
+
+ <% var cgs = g.getCourseCategoriesForProfile( p ); %> + <% for ( var cgsi = 0; cgsi < cgs.length; cgsi++ ) { %> + <% if ( cgsi > 0 ) { %> + <%= ' ' %> + <% } %> + <%= cgs[ cgsi ].name %> + <% } %> +
+
+ <%= _lc( 'ASSIGNED_MEMBER_CATEOGORY_INFO' ) %> +
+ +
+
+
+
+ <%= _lc( 'MEMBER_CONTRACT' ) %> +
+
+
+
+
+ + +
+
+
+
+ + +
+
+
+ +
+
+
+
+
+ <%= _lc( 'APPOINTMENT_LOG' ) %> +
+
+
+
+
+ + +
+
+
+
+ + +
+
+
+ +
+
+
+
+ +
+
+
+
+
+ <%= _lc( 'ADMIN_NOTES' ) %> - <%= _lc( 'ADMIN_NOTES_INFO' ) %> +
+
+
+
+ +
+
+
+
+ +
+
<% } %> -
-
- <%= _lc( 'ASSIGNED_MEMBER_CATEOGORY_INFO' ) %> -
- -
-
-
-
- <%= _lc( 'MEMBER_CONTRACT' ) %> -
-
-
-
-
- - -
-
-
-
- - -
-
-
- -
-
-
-
-
- <%= _lc( 'APPOINTMENT_LOG' ) %> -
-
-
-
-
- - -
-
-
-
- - -
-
-
- -
-
-
-
- -
-
-
-
-
- <%= _lc( 'ADMIN_NOTES' ) %> - <%= _lc( 'ADMIN_NOTES_INFO' ) %> -
-
-
-
- -
-
-
-
- -
-
- <% } else { %> - -
-
- <%= _lc( 'SELECT_MEMBER_TO_EDIT' ) %> +
+
+ <%= _lc( 'SELECT_MEMBER_TO_EDIT' ) %> +
-
- <% } %> \ No newline at end of file diff --git a/src/client/app/tmpl/group-member-management.html b/src/client/app/tmpl/group-member-management.html index 4448256..63557dc 100644 --- a/src/client/app/tmpl/group-member-management.html +++ b/src/client/app/tmpl/group-member-management.html @@ -46,6 +46,12 @@ <%= _lc( 'GROUP_MANAGEMENT_MEMBERS_NOT_APPROVED' ) %> (<%= membersNotApproved.length %>) +
@@ -86,6 +92,18 @@
+
+
+ + + <% for ( var mi = 0; mi < membersDeleted.length; mi++ ) { %> + <%=raw app.core.View.getTemplate( 'group-member-management-row', { m : membersDeleted[ mi ], g : group } ) %> + <% } %> + +
+
+
+
diff --git a/src/client/app/tmpl/gui-navbar.html b/src/client/app/tmpl/gui-navbar.html index 6df1eae..d11dd1e 100644 --- a/src/client/app/tmpl/gui-navbar.html +++ b/src/client/app/tmpl/gui-navbar.html @@ -1,4 +1,4 @@ -