Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

To Do in Code 2 #278

Open
Devconf opened this issue Mar 21, 2021 · 0 comments
Open

To Do in Code 2 #278

Devconf opened this issue Mar 21, 2021 · 0 comments
Labels
doc Works about documentation

Comments

@Devconf
Copy link
Contributor

Devconf commented Mar 21, 2021

FIXME

core\node\common\user.dart

Future<List<Board>> getMyBoards(User me) async {
    if (me._myBoards == null) {
      me._myBoards = [];

      /// FIXME: not possible with current node system.
      /// make new type of Node getChildren by Reply, Like, Bookmark
    }
    return this._myBoards;
  }

ui\view\profile\profile_view.dart

widget.isMine && false
              // FIXME: not possible with current node system.
              ? PadongFutureBuilder(
                  future: Session.user.getMyBoards(Session.user),
                  builder: (boards) => BoardList(boards, icons: [
                        Icons.mode_comment_rounded,
                        Icons.favorite_rounded,
                        Icons.bookmark_rounded
                      ]))
              : SizedBox.shrink()

TODO

core\search_engine.dart

static Future<List<TitleNode>> search(String type, String searching) async {
    List<String> keywords =
        searching.split(' ').map((keyword) => keyword.toLowerCase()).toList();
    if (type == 'like' || type == 'bookmark')
      return [
        // TODO: get Post by like and bookmark
      ];
    else if (type == 'chat') type = 'chatroom';
    // TODO: memo & question
    List<TitleNode> nodes = await PadongFB.getDocsByRule(type, limit: 30).then(
        (docs) => <TitleNode>[
              ...docs.map((doc) => Nodes.generateNode(type, doc.id, doc.data()))
            ]);

core\node\chat\chat_room.dart

  Future<int> countUnread(User me) async {
    // TODO: based on Participant's modifiedAt, message's createdAt
    return 0;
  }

core/node/cover/item.dart

  void revertWikiToThisItem() {
    // TODO: revert Wiki to this Item
    // check current Item & User authority
  }

core/node/cover/wiki.dart

 void updateBackLinks(String targetWikiId, {bool isRemove = false}) async {
    // TODO: update firebase with Transaction, Target Wiki's frontLinks update
  }

  void updateFrontLinks(String targetWikiId, {bool isRemove = false}) async {
    // TODO: update firebase with Transaction, Target Wiki's backLinks update
  }

core/node/map/service.dart

class Service extends Evaluation {
  SERVICE serviceCode;

  Service();

  Service.fromMap(String id, Map snapshot)
      : this.serviceCode = parseSERVICE(snapshot['serviceCode']),
        super.fromMap(id, snapshot);

  @override
  generateFromMap(String id, Map snapshot) => Service.fromMap(id, snapshot);

  @override
  Map<String, dynamic> toJson() {
    return {
      ...super.toJson(),
      'serviceCode': serviceToString(this.serviceCode),
    };
  }

// TODO: when CRUD Service, update building's serviceCheckBit
// One building can serve same type of services, not only one.
}

core\node\schedule\question.dart

class Question extends Post {
  Question();

  Question.fromMap(String id, Map snapshot) : super.fromMap(id, snapshot);

  @override
  generateFromMap(String id, Map snapshot) => Question.fromMap(id, snapshot);

// TODO: Adopt an answer
}

core/node/schedule/schedule.dart

  Future<List<Event>> getMyEvents(User me) async {
    // TODO: get Public, Internal Events from Schedule also
    return <Event>[...(await me.getChildren(Event(), upToDate: true))];
  }

core/service/padong_auth

 static Future<String> changeEmail(String email) async {
    await _auth.currentUser.reload();
    User sessionUser = _auth.currentUser;
    if (sessionUser == null) return null;

    try {
      // TODO: Must Check changeEmail with exist email.
      // In Firebase Auth Document, verifyBeforeUpdateEmail's Error code doesn't
      // have [auth/email-already-in-use].
      await sessionUser.verifyBeforeUpdateEmail(email);

core\service\session.dart

static ACCESS checkAccess(Node node) {
    // TODO: check it's right?
    if (node.ownerId == user.id) return ACCESS.READWRITE;
    if (node.pip == PIP.PUBLIC) {
      return ACCESS.READWRITE;
    } else if (node.pip == PIP.INTERNAL) {
      if (inMyUniv && node.type == 'board') return ACCESS.READWRITE;
      return ACCESS.READONLY;
    } else if (inMyUniv && node.type == 'board') return ACCESS.READWRITE;
    return ACCESS.DENIED;
  }

ui\template\markdown_editor_template.dart

void onTabOk() {
    if(this._titleController.text.isNotEmpty && this._mdController.text.isNotEmpty) {
      Map data = {
        'title': this._titleController.text,
        'description': this._mdController.text,
        'ownerId': Session.user.id,
      };
      if (widget.topArea == null)
        data['pip'] =
            pipToString([PIP.PUBLIC, PIP.INTERNAL, PIP.PRIVATE][this.pipIdx]);
      widget.onSubmit(data);
      PadongRouter.goBack();
    }
    // TODO: alert no empty title & description
  }

ui\view\chat\chat_room_view.dart

appBar: BackAppBar(title: widget.chatRoom.title, isClose: true, actions: [
        IconButton(
            icon: Icon(Icons.more_horiz, color: AppTheme.colors.support),
            onPressed: () {}) // TODO: more dialog
      ])

ui\view\chat\chat_room_view.dart

void updateUnread() async {
    // TODO: to make unread clear using Participant
  }

ui/views/chat/chats_view.dart

  appBar: BackAppBar(title: 'Chats', actions: [
          IconButton(
              icon: Icon(Icons.more_horiz, color: AppTheme.colors.support),
              onPressed: () {}) // TODO: more dialog
        ])

ui\view\cover\argue_view.dart

child: Container(
                // TODO: close argue
                key: this.argueKeys[argue.id],
                color: this.readyReReply[argue.id]
                    ? AppTheme.colors.semiPrimary
                    : null,
                child: ReplyTile(argue)))

ui\view\cover\edit_view.dart

void createWiki(Map data) async {
    // TODO: transaction
    Wiki _wiki = await Wiki.fromMap('', {
      ...data,
      'parentId': this.cover.id,
    }).create();
    await Item.fromMap('', {
      ...data,
      'parentId': _wiki.id,
      'prevDescription': '',
    }).create();
  }

ui/views/deck/board_view.dart

appBar: BackAppBar(title: widget.board.title, actions: [
          IconButton(
              icon: Icon(Icons.more_horiz, color: AppTheme.colors.support),
              onPressed: () {}) // TODO: more dialog
        ])

ui\view\deck\write_view.dart

void createPost(Map data) async {
    // TODO: if user is owner of this board, ask isNotice
    // with dialog
    await Post.fromMap('', {
      ...data,
      'parentId': this.board.id,
      'pip': pipToString(this.board.pip),
      'anonymity': TipInfo.isAnonym,
      'isNotice': false,
    }).create();
  }

ui\view\home\home_view.dart

List<Widget> aboutArea() {
    return [
      this._title('About Georgia Tech'), // TODO: from currentUniv
      SizedBox(height: 10),
      PadongFutureBuilder(
          future: this.university.getChildren(Wiki()),
          builder: (wikis) => Column(
                children: <Widget>[...wikis.map((wiki) => ImageCard(wiki))],
              ))
    ];
  }

ui\view\home\home_view.dart

List<Widget> padongArea() {
    return [
      this._title('PADONG'),
      // TODO: create PADONG univ, create boards
      // BoardList(boards: ['freeTalk', 'questionAnswer', 'inform']),
      PadongFutureBuilder(
          future: this.university.getChildren(Board()),
          builder: (boards) => BoardList(<Board>[...boards])),
      Container(
          alignment: Alignment.center,
          padding: const EdgeInsets.only(top: 30),
          child: Text('Contact Us')),
      Container(
          alignment: Alignment.center,
          padding: const EdgeInsets.only(bottom: 20),
          child: Text('Copyright 2021. PADONG. All rights reserved.',
              style: AppTheme.getFont(
                  color: AppTheme.colors.semiSupport,
                  fontSize: AppTheme.fontSizes.small))),
    ];
  }

ui\view\map\service_view.dart

Positioned(
          bottom: 5,
          right: 0,
          child: SimpleButton('',
              buttonSize: ButtonSize.SMALL,
              icon: Icon(Icons.more_horiz,
                  color: AppTheme.colors.support, size: 20), onTap: () {
            // TODO: click more
          })

ui\view\profile\configure_view.dart

Widget build(BuildContext context) {
    return SafePaddingTemplate(

    ...

    children: [
          Row(mainAxisAlignment: MainAxisAlignment.end, children: [
            SizedBox(
                width: 32,
                height: 20,
                child: IconButton(
                    padding: const EdgeInsets.all(0),
                    onPressed: () {}, // TODO: more dialog
                    icon: Icon(Icons.more_horiz_rounded,
                        color: AppTheme.colors.support))),
          ]),

    ...
    ]);
}

ui\view\profile\configure_view.dart

Widget configures(BuildContext context) {
    double paddingBottom = MediaQuery.of(context).padding.bottom;
    return Container(
        alignment: Alignment.center,
        width: MediaQuery.of(context).size.width,
        child: Container(
            width: MediaQuery.of(context).size.width -
                2 * (AppTheme.horizontalPadding + 30),
            child: Column(children: [

             ...

             Input(
                  isPrivacy: true,
                  controller: this._controllers[1],
                  margin: EdgeInsets.only(top: 10.0),
                  labelText: 'Repeat Password',
                  errorText: this._pwMatchError,
                  onChanged: (repeat) => setState(() => this._pwMatchError =
                      repeat != this._controllers[0].text
                          ? "Repeat Password doesn't match"
                          : null)),
              // TODO: check match feedback real-time
       
             ...

            // TODO: get univ list
              ListPicker(
                this._controllers[4],
                margin: EdgeInsets.only(top: 10.0),
                labelText: 'Entrance Year',
                list: List.generate(10, (y) => 2021 - y),
              ),

ui\view\profile\friends_view.dart

Widget friendList(List<User> friends) {
    return Column(
        children: friends
            .map((friend) => InkWell(
                onTap: () => PadongRouter.routeURL(
                    '/profile?id=${friend.id}&type=user', friend),
                child:
                    FriendTile(friend, onTapChat: this.chatWith, onTapMore: () {
                  // TODO: more dialog
                })))
            .toList());
  }

ui\view\profile\friends_view.dart

void chatWith(User user) {
    // TODO : check chatRoom exists
    // PadongRouter.routeURL('/chatroom?id=${}', chatroom);
  }

ui\view\profile\profile_view.dart

List<Widget> topAction() {
    return widget.isMine
        ? [
            SizedBox(
                width: 32,
                child: IconButton(
                    onPressed: () => PadongRouter.routeURL('/configure'),
                    icon: Icon(Icons.settings_rounded,
                        color: AppTheme.colors.support)))
          ]
        : [
            SizedBox(
                width: 32,
                child: IconButton(
                    onPressed: () {}, // TODO: more dialog
                    icon: Icon(Icons.more_horiz_rounded,
                        color: AppTheme.colors.support))),
            SizedBox(
                width: 32,
                child: IconButton(
                    // TODO: check chatRoom is exists
                    onPressed: () => PadongRouter.routeURL(
                        '/chat?id=${widget.user.id}&type=user', widget.user),
                    icon: Icon(Icons.mode_comment_outlined,
                        color: AppTheme.colors.support))),
          ];
  }

ui\view\schedule\ask_view.dart

void createQuestion(Map data) async {
    // TODO: if user is owner of this board, ask isNotice
    // with dialog
    await Question.fromMap('', {
      ...data,
      'parentId': this.lecture.id,
      'pip': pipToString(this.lecture.pip),
      'anonymity': TipInfo.isAnonym,
      'isNotice': false,
    }).create();
  }

ui\view\schedule\event_view.dart

appBar: BackAppBar(title: widget.event.title, actions: [
          IconButton(
              icon: Icon(Icons.more_horiz, color: AppTheme.colors.support),
              onPressed: () {
                PadongRouter.refresh = null;
                PadongRouter.routeURL(
                    '/update?id=${widget.event.id}&type=event', widget.event);
              }) // TODO: more dialog
        ])

ui\view\schedule\lecture_view.dart

appBar: BackAppBar(title: widget.lecture.title, actions: [
        IconButton(
            icon: Icon(Icons.mode_comment_outlined,
                color: AppTheme.colors.support),
            onPressed: () {}), // TODO: route to chat
        IconButton(
            icon: Icon(Icons.more_horiz, color: AppTheme.colors.support),
            onPressed: () {
              PadongRouter.routeURL(
                  '/update?id=${widget.lecture.id}&type=lecture',
                  widget.lecture);
            }) // TODO: more dialog
      ])

ui\view\schedule\memo_view.dart

void createMemo(Map data) async {
    // TODO: if user is owner of this board, ask isNotice
    // with dialog
    await Memo.fromMap('', {
      ...data,
      'parentId': this.event.id,
      'pip': pipToString(this.event.pip),
      'anonymity': TipInfo.isAnonym,
      'isNotice': false,
    }).create();
  }

ui\view\sign\sign_up_view.dart

Widget build(BuildContext context) {
    double bottomPadding = MediaQuery.of(context).padding.bottom;
    return BaseSignView(
      isSignIn: false,
      welcomeMsg: "Welcome",
      idErrorText: this._errorTexts[0],
      idController: this._controllers[0],
      onIdChanged: (_) => this._setErrorText(),
      forms: [
      
        ...

       ListPicker(
          this._controllers[4],
          margin: EdgeInsets.only(top: 8.0),
          labelText: this._labels[4],
          list: ['Georgia Tech'],
          errorText: this._errorTexts[4], // TODO: get from PB
        ),

        ...

ui\widget\node_base.dart

void onMoreTap() {
    // TODO: Click more button " ... "
  }

ui\widget\bar\top_app_bar.dart

Widget build(BuildContext context) {
    return AppBar(
        // when dark mode, using dark
        brightness: Brightness.light,
        backgroundColor: Colors.transparent,
        elevation: 0,
        leading: InkWell(
            onTap: () {
              // TODO: routing to Padong Main and change current univ
            },

ui\widget\card\image_card.dart

Widget build(BuildContext context) {
    return InkWell(
        onTap: () => PadongRouter.routeURL('/${this.node.type}?id=${this.node.id}', this.node),
        child: Card(
            shape: RoundedRectangleBorder(
              borderRadius: BorderRadius.circular(5.0),
            ),
            elevation: 1.5,
            child: Stack(children: [
              Container(
                  width: MediaQuery.of(context).size.width -
                      AppTheme.horizontalPadding * 2,
                  height: 120,
                  padding: EdgeInsets.all(10),
                  // TODO: get image from wiki

ui\widget\card\university_card.dart

class UniversityCard extends StatelessWidget {
  final University univ;

  UniversityCard(this.univ);

  @override
  Widget build(BuildContext context) {
    return InkWell(
        // TODO: use emblem
        onTap: this.moveUniversity,

ui\widget\container\timeline.dart

class Timeline extends StatefulWidget {
  final String date; // TODO: DateTime class
  final Map<String, List<Widget>> timeline;

ui\widget\dialog\image_uploader.dart

Future<void> _uploadImageWith(Function(String) onTapOk) async {
    if (this._image == null) return;
    List<String> _temp = this._image.path.split('/');
    String fileName = _temp[_temp.length - 1];
    Reference firebaseStorageRef = // TODO: identical image file nae
        FirebaseStorage.instance.ref().child('image/$fileName');
    UploadTask uploadTask = firebaseStorageRef.putFile(File(this._image.path));
    await uploadTask.whenComplete(() => uploadTask.snapshot.ref
        .getDownloadURL()
        .then((String url) => onTapOk(url)));
  }

ui\widget\tile\chat_balloon.dart

class ChatBalloon extends StatelessWidget {
  // TODO: img!
  final bool isMine;
  
  ...

ui\widget\tile\friend_tile.dart

class FriendTile extends StatelessWidget {
  final User user;
  final FriendTileType type;
  final bool invited;
  final Function(User user) onTapChat;
  final Function onTapMore;

  FriendTile(
    this.user, {
    this.type = FriendTileType.LIST,
    this.onTapChat, // TODO
    this.onTapMore,
    this.invited = false,
  });

ui\widget\tile\node\node_tile.dart

void moreCallback() {
    // TODO: Click more button " ... "
  }

util\compare\diff_line.dart

//Todo: Have to optimize with https://en.wikipedia.org/wiki/Longest_common_subsequence_problem#Reduce_the_problem_set
//Todo: Have to study google/diff-match-patch's Algorithm (  Myer's diff algorithm, https://neil.fraser.name/writing/diff/ )
List<Diff> diffLine(String prev, String next) {
  List<Diff> result = [];
  prev = 'prev\n'+ prev ;
  next = 'next\n' + next ;
  List<String> p = toLinuxNewLine(prev).split('\n');
  List<String> n = toLinuxNewLine(next).split('\n');

  ...

  }
@Devconf Devconf assigned Devconf and unassigned Devconf Mar 21, 2021
@Devconf Devconf added the doc Works about documentation label Mar 21, 2021
@jtjun jtjun mentioned this issue Mar 21, 2021
@jtjun jtjun added this to the Connect Node and View milestone Mar 21, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
doc Works about documentation
Projects
None yet
Development

No branches or pull requests

2 participants