about summary refs log tree commit diff
path: root/configs/shared/emacs/.emacs.d/elpa/slack-20180913.651/slack-dialog-buffer.el
diff options
context:
space:
mode:
Diffstat (limited to 'configs/shared/emacs/.emacs.d/elpa/slack-20180913.651/slack-dialog-buffer.el')
-rw-r--r--configs/shared/emacs/.emacs.d/elpa/slack-20180913.651/slack-dialog-buffer.el377
1 files changed, 377 insertions, 0 deletions
diff --git a/configs/shared/emacs/.emacs.d/elpa/slack-20180913.651/slack-dialog-buffer.el b/configs/shared/emacs/.emacs.d/elpa/slack-20180913.651/slack-dialog-buffer.el
new file mode 100644
index 000000000000..c1d42cb4dca9
--- /dev/null
+++ b/configs/shared/emacs/.emacs.d/elpa/slack-20180913.651/slack-dialog-buffer.el
@@ -0,0 +1,377 @@
+;;; slack-dialog-buffer.el ---                       -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2018  南優也
+
+;; Author: 南優也 <yuyaminami@minamiyuuya-no-MacBook.local>
+;; Keywords:
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;;
+
+;;; Code:
+(require 'eieio)
+(require 'slack-buffer)
+(require 'slack-dialog)
+
+(define-derived-mode slack-dialog-buffer-mode fundamental-mode "Slack Dialog Buffer"
+  (setq-local default-directory slack-default-directory)
+  (setq-local buffer-read-only t))
+
+(defvar slack-dialog-submit-button-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map (kbd "RET") #'slack-dialog-buffer-submit)
+    (define-key map [mouse-1] #'slack-dialog-buffer-submit)
+    map))
+
+(defvar slack-dialog-cancel-button-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map (kbd "RET") #'slack-dialog-buffer-cancel)
+    (define-key map [mouse-1] #'slack-dialog-buffer-cancel)
+    map))
+
+(defvar slack-dialog-select-element-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map (kbd "RET") #'slack-dialog-buffer-select)
+    (define-key map [mouse-1] #'slack-dialog-buffer-select)
+    map))
+
+(defface slack-dialog-element-placeholder-face
+  '((t (:inherit font-lock-comment-face :slant normal
+                 ;; :box (:line-width 1 :color "#fff")
+                 )))
+  "Used to dialog's element placeholder"
+  :group 'slack)
+
+(defface slack-dialog-element-error-face
+  '((t (:inherit font-lock-warning-face)))
+  "Used to dialog's element error message"
+  :group 'slack)
+
+(defface slack-dialog-element-hint-face
+  '((t (:inherit font-lock-comment-face :slant italic)))
+  "Used to dialog's element hint"
+  :group 'slack)
+
+(defface slack-dialog-element-label-face
+  '((t (:weight bold)))
+  "Used to dialog's element label"
+  :group 'slack)
+
+(defface slack-dialog-select-element-input-face
+  '((t (:box (:line-width 1 :style released-button))))
+  "Used to dialog's select element input"
+  :group 'slack)
+
+(defface slack-dialog-title-face
+  '((t (:weight bold :height 1.2)))
+  "Used to dialog's title"
+  :group 'slack)
+
+(defface slack-dialog-submit-button-face
+  '((t (:box (:line-width 1 :style released-button)
+             :foreground "#2aa198")))
+  "Used to dialog's submit button"
+  :group 'slack)
+
+(defface slack-dialog-cancel-button-face
+  '((t (:box (:line-width 1 :style released-button))))
+  "Used to dialog's cancel button"
+  :group 'slack)
+
+(defclass slack-dialog-buffer (slack-buffer)
+  ((dialog-id :initarg :dialog-id :type string)
+   (dialog :initarg :dialog :type slack-dialog)))
+
+(defmethod slack-buffer-name :static ((_class slack-dialog-buffer) dialog-id dialog team)
+  (with-slots (title) dialog
+    (format "*Slack Dialog - %s [%s] : %s*"
+            title
+            dialog-id
+            (slack-team-name team))))
+
+(defmethod slack-buffer-name ((this slack-dialog-buffer))
+  (with-slots (dialog-id dialog team) this
+    (slack-buffer-name 'slack-dialog-buffer
+                       dialog-id dialog team)))
+
+(defmethod slack-buffer-find :static ((class slack-dialog-buffer)
+                                      dialog-id dialog team)
+  (slack-buffer-find-4 class dialog-id dialog team))
+
+(defmethod slack-buffer-insert-label ((this slack-dialog-element))
+  (with-slots (label optional) this
+    (insert (propertize label
+                        'face 'slack-dialog-element-label-face))
+    (when optional
+      (insert " (optional)"))))
+
+(defmethod slack-buffer-insert-hint ((this slack-dialog-text-element))
+  (with-slots (hint) this
+    (when hint
+      (insert "\n")
+      (insert (propertize hint
+                          'face 'slack-dialog-element-hint-face))
+      (insert "\n"))))
+
+(defvar slack-dialog-element-edit-button-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map (kbd "RET") #'slack-dialog-buffer-open-edit-element-buffer)
+    (define-key map [mouse-1] #'slack-dialog-buffer-open-edit-element-buffer)
+    map))
+
+(defmethod slack-buffer-insert-edit-button ((this slack-dialog-text-element))
+  (insert (propertize " Edit "
+                      'face '(:box (:line-width 1 :style released-button))
+                      'keymap slack-dialog-element-edit-button-map
+                      'slack-dialog-element this)))
+
+(defun slack-dialog-buffer-open-edit-element-buffer ()
+  (interactive)
+  (slack-if-let*
+      ((element (get-text-property (point) 'slack-dialog-element))
+       (buffer slack-current-buffer)
+       (team (oref buffer team))
+       (edit-buffer (slack-create-dialog-element-edit-buffer
+                     buffer element team)))
+      (slack-buffer-display edit-buffer)))
+
+(defmethod slack-buffer-insert-placeholder ((this slack-dialog-text-element))
+  (with-slots (placeholder) this
+    (insert (propertize placeholder
+                        'face 'slack-dialog-element-placeholder-face))))
+
+(defmethod slack-buffer-insert-errors ((this slack-dialog-element))
+  (with-slots (errors) this
+    (mapc #'(lambda (err)
+              (insert (propertize (oref err error-message)
+                                  'face 'slack-dialog-element-error-face))
+              (insert "\n"))
+          errors)))
+
+(defmethod slack-buffer-insert ((this slack-dialog-text-element))
+  (with-slots (value placeholder errors) this
+    (slack-buffer-insert-label this)
+    (insert " ")
+    (slack-buffer-insert-edit-button this)
+    (insert "\n")
+    (if value
+        (insert value)
+      (if placeholder
+          (slack-buffer-insert-placeholder this)
+        (insert "Click Edit")))
+    (insert "\n")
+    (slack-buffer-insert-errors this)
+    (slack-buffer-insert-hint this)))
+
+(defmethod slack-buffer-insert ((this slack-dialog-textarea-element))
+  (with-slots (value placeholder) this
+    (slack-buffer-insert-label this)
+    (insert "  ")
+    (slack-buffer-insert-edit-button this)
+    (insert "\n")
+    (if value
+        (insert value)
+      (if placeholder
+          (slack-buffer-insert-placeholder this)
+        (insert "Click Edit")))
+    (insert "\n")
+    (slack-buffer-insert-errors this)
+    (slack-buffer-insert-hint this)))
+
+(defun slack-dialog-buffer-select ()
+  (interactive)
+  (slack-if-let*
+      ((buffer slack-current-buffer)
+       (team (oref buffer team))
+       (dialog (oref buffer dialog))
+       (dialog-id (oref buffer dialog-id))
+       (element-name (get-text-property (point) 'slack-dialog-element-name))
+       (dialog-element (cl-find-if #'(lambda (el) (string= element-name
+                                                           (oref el name)))
+                                   (oref dialog elements)))
+       (selected (slack-dialog--execute dialog-element
+                                        dialog-id
+                                        team))
+       (label (car selected))
+       (value (cdr selected))
+       (option (make-instance 'slack-dialog-select-option
+                              :label label
+                              :value value)))
+      (progn
+        (oset dialog-element selected-options (list option))
+        (oset dialog-element value value)
+        (slack-dialog-buffer-redisplay buffer))))
+
+(defmethod slack-buffer-insert-select-button ((this slack-dialog-select-element))
+  (let ((label (slack-if-let*
+                   ((selected (slack-dialog-selected-option this)))
+                   (slack-selectable-text selected)
+                 "Choose an option...")))
+
+    (insert (propertize (format " %s " label)
+                        'face 'slack-dialog-select-element-input-face
+                        'keymap slack-dialog-select-element-map
+                        'slack-dialog-element-name (oref this name)))))
+
+(defmethod slack-buffer-insert ((this slack-dialog-select-element))
+  (slack-buffer-insert-label this)
+  (insert "\n")
+  (slack-buffer-insert-select-button this)
+  (insert "\n")
+  (slack-buffer-insert-errors this))
+
+(defun slack-dialog-buffer-submit ()
+  (interactive)
+  (slack-if-let*
+      ((buffer slack-current-buffer))
+      (slack-dialog-buffer--submit buffer)))
+
+(defmethod slack-dialog-buffer--submit ((this slack-dialog-buffer))
+  (with-slots (dialog dialog-id team) this
+    (with-slots (elements) dialog
+      (dolist (element elements)
+        (let ((value (slack-dialog-element-value element)))
+          (slack-dialog-element-validate element value)))
+      (let ((params (mapcar #'(lambda (element)
+                                (cons (oref element name)
+                                      (slack-dialog-element-value element)))
+                            elements)))
+        (cl-labels
+            ((create-dialog-element-error
+              (payload)
+              (make-instance #'slack-dialog-element-error
+                             :name (plist-get payload :name)
+                             :error-message (plist-get payload :error)))
+             (set-dialog-element-error
+              (dialog-error elements)
+              (slack-if-let*
+                  ((element (cl-find-if #'(lambda (el)
+                                            (string= (oref el name)
+                                                     (oref dialog-error name)))
+                                        elements))
+                   (new-errors (cons dialog-error
+                                     (cl-remove-if #'(lambda (e)
+                                                       (string= (oref e name)
+                                                                (oref dialog-error
+                                                                      name)))
+                                                   (oref element errors)))))
+                  (oset element errors new-errors)))
+             (after-success
+              (data)
+              (slack-if-let* ((err (plist-get data :error)))
+                  (progn
+                    (oset dialog error-message err)
+                    (dolist (dialog-error (mapcar #'create-dialog-element-error
+                                                  (plist-get data :dialog_errors)))
+                      (set-dialog-element-error dialog-error elements))
+
+                    (slack-dialog-buffer-redisplay this))
+                (slack-dialog-buffer-kill-buffer this))))
+          (slack-dialog-clear-errors dialog)
+          (slack-dialog--submit dialog dialog-id team params #'after-success))))))
+
+(defun slack-dialog-buffer-cancel ()
+  (interactive)
+  (slack-if-let* ((buffer slack-current-buffer))
+      (with-slots (dialog dialog-id team) buffer
+        (slack-dialog-notify-cancel dialog dialog-id team)
+        (slack-dialog-buffer-kill-buffer buffer))))
+
+(defmethod slack-dialog-buffer-kill-buffer ((this slack-dialog-buffer))
+  (slack-if-let* ((buffer-name (slack-buffer-name this))
+                  (buf (get-buffer buffer-name))
+                  (win (get-buffer-window buf)))
+      (progn
+        (kill-buffer buf)
+        (when (< 1 (count-windows))
+          (delete-window win)))))
+
+(defmethod slack-buffer-insert ((this slack-dialog-buffer))
+  (with-slots (dialog) this
+    (with-slots (error-message title elements submit-label) dialog
+      (let ((inhibit-read-only t))
+        (insert (propertize title
+                            'face 'slack-dialog-title-face))
+        (when error-message
+          (insert "\n")
+          (insert (propertize error-message
+                              'face 'slack-dialog-element-error-face)))
+        (insert "\n\n")
+        (mapc #'(lambda (el)
+                  (slack-buffer-insert el)
+                  (insert "\n"))
+              elements)
+        (insert "\n")
+        (insert (propertize " Cancel "
+                            'face 'slack-dialog-cancel-button-face
+                            'keymap slack-dialog-cancel-button-map))
+        (insert "\t")
+        (insert (propertize (format " %s " submit-label)
+                            'face 'slack-dialog-submit-button-face
+                            'keymap slack-dialog-submit-button-map))
+        (goto-char (point-min))))))
+
+(defmethod slack-buffer-init-buffer ((this slack-dialog-buffer))
+  (let* ((buf (generate-new-buffer (slack-buffer-name this)))
+         (dialog (oref this dialog))
+         (dialog-id (oref this dialog-id))
+         (team (oref this team)))
+    (with-current-buffer buf
+      (slack-dialog-buffer-mode)
+      (slack-buffer-set-current-buffer this)
+      (slack-buffer-insert this))
+    (slack-buffer-push-new-4 'slack-dialog-buffer
+                             dialog-id dialog team)))
+
+(defun slack-create-dialog-buffer (dialog-id dialog team)
+  (slack-if-let*
+      ((buf (slack-buffer-find 'slack-dialog-buffer
+                               dialog-id
+                               dialog
+                               team)))
+      buf
+    (make-instance 'slack-dialog-buffer
+                   :dialog-id dialog-id
+                   :dialog dialog
+                   :team team)))
+
+(defmethod slack-dialog-buffer-save-element-value ((this slack-dialog-buffer)
+                                                   name
+                                                   value)
+  (with-slots (dialog) this
+    (with-slots (elements) dialog
+      (let ((element (cl-find-if #'(lambda (el)
+                                     (string= name
+                                              (oref el name)))
+                                 elements)))
+        (oset element value value)
+        (slack-dialog-buffer-redisplay this)))))
+
+(defmethod slack-dialog-buffer-redisplay ((this slack-dialog-buffer))
+  (slack-if-let* ((bufname (slack-buffer-name this))
+                  (buf (get-buffer bufname)))
+      (with-current-buffer buf
+        (let ((inhibit-read-only t)
+              (cur-point (point)))
+          (delete-region (point-min) (point-max))
+          (slack-buffer-insert this)
+          (when (and (< (point-min) cur-point)
+                     (< cur-point (point-max)))
+            (goto-char cur-point))))))
+
+(provide 'slack-dialog-buffer)
+;;; slack-dialog-buffer.el ends here